标签:复习 ase xtend 执行 javase show tar play void
1. 实现多线程的两种方式
1 //1. 继承Thread类,重写run方法 2 class FirstThread extends Thread { 3 private int counter = 10; 4 public FirstThread(String name){ 5 super(name); 6 } 7 public void run(){ 8 String threadName = Thread.currentThread().getName(); 9 while(counter>0){ 10 System.out.println(threadName + ":" + counter); 11 counter--; 12 } 13 } 14 } 15 //2. 实现Runnable接口,重写run方法 16 class SecondThread implements Runnable { 17 private int counter = 10; 18 public void run(){ 19 String threadName = Thread.currentThread().getName(); 20 while(counter>0){ 21 System.out.println(threadName + ":" + counter);
22 counter--; 23 } 24 } 25 }
实现方式不同,使用方式也不同
1 public class Demo1 { 2 public static void main(String[] args){ 3 FirstThread t1 = new FirstThread("线程1"); 4 t1.start(); 5 6 SecondThread t2 = new SecondThread(); 7 (new Thread(t2, "线程2")).start(); 8 } 9 }
运行结果大致如下:
线程1:10 线程1:9 线程1:8 线程1:7 线程1:6 线程1:5 线程1:4 线程1:3 线程1:2 线程1:1 线程2:10 线程2:9 线程2:8 线程2:7 线程2:6 线程2:5 线程2:4 线程2:3 线程2:2 线程2:1
建议使用“实现Runnable接口,重写run方法”的方式来实现多线程,它有如下优点:
1. 线程和代码分离,多线程间可以共享资源
2. 避免了单继承带来的局限性
2. 多线程之间共享资源
还是以上面的类FirstThread和SecondThread为例
SecondThread t = new SecondThread(); (new Thread(t, "线程1")).start(); (new Thread(t, "线程2")).start(); (new Thread(t, "线程3")).start();
运行结果:
线程2:10 线程3:10 线程1:10 线程3:8 线程2:9 线程3:6 线程1:7 线程3:4 线程1:3 线程2:5 线程1:1 线程3:2
明显的看出:三个线程共享了成员变量counter。线程在start方法中调用了run方法,这三个线程的都使用了同一个对象t,从而都可以访问该对象的成员变量。
但是三个线程都争着抢着要执行t的run方法,就有可能发生前一个线程刚执行完 System.out.println(threadName + ":" + counter); ,还没来得及执行下一句代码 counter--; 呢,后一个线程就抢着CPU的执行权了,于是这句代码 System.out.println(threadName + ":" + counter); 又一次被执行,相同的counter的被两次使用,于是就出现了前后两个线程输出结果相同的情况。为了这种线程安全问题,Java提供了 synchronized 来实现线程同步。
3. 线程同步
标签:复习 ase xtend 执行 javase show tar play void
原文地址:http://www.cnblogs.com/lhat/p/6819170.html