JavaSE复习总结多线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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复习总结多线程的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE复习_10 多线程复习

JavaSE复习4

javaSE复习之——线程

线程学习知识点总结

012期JavaSE面试题:多线程

011期JavaSE面试题:多线程