首页 > 代码库 > 【JavaSE复习总结】多线程

【JavaSE复习总结】多线程

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
View Code

建议使用“实现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
View Code

明显的看出:三个线程共享了成员变量counter。线程在start方法中调用了run方法,这三个线程的都使用了同一个对象t,从而都可以访问该对象的成员变量。

但是三个线程都争着抢着要执行t的run方法,就有可能发生前一个线程刚执行完  System.out.println(threadName + ":" + counter); ,还没来得及执行下一句代码  counter--; 呢,后一个线程就抢着CPU的执行权了,于是这句代码 System.out.println(threadName + ":" + counter); 又一次被执行,相同的counter的被两次使用,于是就出现了前后两个线程输出结果相同的情况。为了这种线程安全问题,Java提供了 synchronized 来实现线程同步。

 

3. 线程同步

 

【JavaSE复习总结】多线程