首页 > 代码库 > 【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
建议使用“实现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. 线程同步
【JavaSE复习总结】多线程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。