标签:
线程:
方式一:继承Thread类并且复写run方法.
格式:
class MyThread extends Thread
{
public void run()
{
线程中要运行的代码.
}
}
其步骤为:
1.定义类继承Thread类.
2.复习run方法.---->目的是:用于存储线程中要运行的代码,将自定义的代码存储在run方法中,让线程运行.
3.调用线程的start方法
注意:不是调用run方法.
线程的名字:一般线程有默认的名字,形式为:Thread-编号,编号是从0开始标记的.
也可以获取当前运行线程的名字,用方法:Thread.currentThread().getName()
Thread.currentThread() 是用于获取当前线程的对象.(静态的).
自定义设置线程的名字可以用setName()或者构造函数来设置.
有关线程的继承方式的代码实例和练习:
1 /* 2 售票窗口例子: 3 多个窗口能够同时卖票. 4 */ 5 6 class Ticket extends Thread 7 { 8 private static int ticket = 100; //不用static时候.两个窗口都会同时卖同号的票,即100张票连个窗口都会卖一次(相当于卖了200次) 9 Ticket(String name) 10 { 11 super(name); 12 } 13 public void run() 14 { 15 while(true) 16 { 17 if(ticket>0) 18 { 19 System.out.println(Thread.currentThread().getName()+"===卖票===="+ticket--); 20 } 21 } 22 } 23 } 24 25 26 class TicketDemo 27 { 28 public static void main(String args[]) 29 { 30 Ticket t1 = new Ticket("窗口1"); 31 Ticket t2 = new Ticket("窗口2"); 32 t1.start(); 33 t2.start(); 34 35 } 36 }
线程的第二种方式:
实现Runnable接口:
格式为:
class MyRunnable implements Runnable
{
public void run()
{
线程中要运行的有关代码.
}
}
其步骤一般为:
1.定义一个类实现Runnable接口.
2.复写Runnable接口中的run方法.
3.通过Thread类来创建一个对象.
4.将Runnable的子类的对象作为实际参数传给Thread类中的构造函数.
5.调用Thread类中的start方法.开启线程,并调用Runnable接口的子类的run方法.(可以理解为run方法又start方法开启调用的)
例如:
class MyRunnable implements Runnable //步骤1
{
public void run() //步骤2
{
S.o.p();
}
}
class RunnableDemo
{
p.s.v.main()
{
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr); //步骤3---4
t1.start(); //步骤5
}
}
继承方式和实现方式的多态的区别和特点:
实现方式:避免了单继承的局限性.一般定义线程时,建议使用实现方式.
区别:
1.继承Thread:线程代码存放在Thread的子类的run方法中.
2.实现Runnabel:线程的代码存放在Runnable接口的子类的run方法中.
最后是同步代码块,解决了多线程的安全性问题
格式为:
synchronized(对象)
{
需要被同步的代码块.
}
有关实现Runnable接口和同步的示例和练习代码:
1 /* 2 多线程的安全问题; 3 打印出了票数为0.-1.-2等问题. 4 5 问题分析,多条语句同时使用同一线程的共享数据时,一个线程只执行了一部分,还未执行完,另一个线程就参与进来执行了,导致共享数据的错误. 6 在if判断中,当ticket=1时,一个线程进去执行语句后,另一个线程也执行进来. 7 此时的ticket已经通过ticket--变成了0,从而导致了输出票数为0或者负数的情况. 8 解决方案: 9 对操作多条共享数据的语句,让一个线程完全执行完毕后才让另一个线程执行,从而避免这种问题的发生. 10 11 同步代码块.关键字:synchronized 12 格式: 13 synchronized(对象) 14 { 15 需要被同步的代码. 16 { 17 18 同步的条件: 19 1.必须是多线程,单线程不能用同步. 20 2.必须是多个线程使用同一个锁. 21 必须保证同步中只有一个线程在运行. 22 23 同步的好处:解决了多线程的安全性问题. 24 缺点:每个线程都要判断锁,影响程序运行速度,耗费资源. 25 */ 26 class Ticket implements Runnable 27 { 28 private int ticket = 100; 29 Object obj = new Object(); 30 public void run() 31 { 32 while(true) 33 { 34 synchronized(obj) //obj相当于锁. 35 { 36 if(ticket>0) 37 { 38 // try{Thread.sleep(10);}catch(Exception e){} 39 System.out.println(Thread.currentThread().getName()+"===卖票====="+ticket--); 40 } 41 } 42 } 43 } 44 } 45 46 class RunnableTicketSafeDemo 47 { 48 public static void main(String args[]) 49 { 50 Ticket t = new Ticket(); //t是共享数据. 51 52 Thread t1 = new Thread(t); 53 Thread t2 = new Thread(t); 54 Thread t3 = new Thread(t); 55 Thread t4 = new Thread(t); 56 57 t1.start(); 58 t2.start(); 59 t3.start(); 60 t4.start(); 61 } 62 }
标签:
原文地址:http://www.cnblogs.com/mosica/p/4523515.html