传统线程技术
传统创建线程方式 1.继承Thread类,覆盖run方法
1 2 Thread t = new Thread(); t.start();
2.实现Runnable接口
Runnable不是线程,是线程要运行的代码的宿主。
1.看看Thread类源码,捋清Runnable,target,run,start关系
Runnable
是一个接口
target
是Thread
类中类型为Runnable
,名为target
的属性
run
是Thread
类实现了Runnable
的接口,重写的方法。
start
是启动线程的方法
在Thread
类中,调用关系为:start
->start0
->run
->target.run
Thread
类的run
方法源码
1 2 3 4 5 public void run () { if (target != null ) { target.run(); } }
Thread
类的target
属性
1 2 private Runnable target;
target
属性由private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc)
方法初始化。init
方法在Thread
类的构造方法里被调用
2.匿名内部类对象的构造方法如何调用父类的非默认构造方法
传统定时器技术 API:
java.util:Class Timer
例子:一个定时器实现交替2秒、3秒打印
1 2 3 4 5 6 7 8 9 10 11 12 13 14 static int count = 0 ;public static void main (String[] args) { class MyTimerTask extends TimerTask { @Override public void run () { System.out.println(Thread.currentThread()+" bomb!" ); new Timer().schedule(new MyTimerTask(), 2000 +1000 *(count++%2 )); } } new Timer().schedule(new MyTimerTask(),3000 ); }
可以使用quarlz
开源工具
互斥 关键字:synchronized
,检查锁对象
synchronized(this)
synchronized void function(){}
synchronized(A.class)
同步 经验:
要用到共同数据(包括同步锁)或共同算法的若干个方法应该归在同一个类身上,这种设计体现了高聚类和程序的健壮性。
同步互斥不是在线程上实现,而是在线程访问的资源上实现,线程调用资源。
例子: 子线程循环5次,主线程循环10次,如此交替50次
设计:
使用一个Business类来包含子线程和主线程要运行的代码,从而,该类的对象成为加锁的对象。同步互斥在该类实现,由线程调用该类的方法,即调用了资源。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 public class TraditionalThreadCommunication { public static void main (String[] args) { Business business = new Business(); new Thread( new Runnable() { @Override public void run () { for (int i=1 ;i<=50 ;i++){ business.sub(i); } } } ).start(); for (int i=1 ;i<=50 ;i++){ business.main(i); } } } class Business { private boolean bShouldSub = true ; public synchronized void sub (int i) { while (!bShouldSub){ try { this .wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int j=1 ;j<=5 ;j++){ System.out.println("sub thread count " +j+"," +i+"/50" ); } bShouldSub = false ; this .notify(); } public synchronized void main (int i) { while (bShouldSub){ try { this .wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int j=1 ;j<=10 ;j++){ System.out.println("main thread count " +j+"," +i+"/50" ); } bShouldSub = true ; this .notify(); } }
判断条件时,while与if的区别:while防止伪唤醒