Contents


传统线程技术

传统创建线程方式

1.继承Thread类,覆盖run方法


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​​方法源码

public void run() {
if (target != null) {
target.run();
}
}


​Thread​​类的​​target​​属性

/* What will be run. */
private Runnable


​target​​属性由​​private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc)​​方法初始化。​​init​​方法在​​Thread​​类的构造方法里被调用

2.匿名内部类对象的构造方法如何调用父类的非默认构造方法

传统定时器技术

API:

​java.util:Class Timer​

例子:一个定时器实现交替2秒、3秒打印


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));
}
}
//3s后开启定时器
new Timer().schedule(new MyTimerTask(),3000);
}


​quarlz​​开源工具

互斥

​synchronized​​,检查锁对象​​synchronized(this)​​​​synchronized void function(){}​​​​synchronized(A.class)​

同步

经验:

  • 要用到共同数据(包括同步锁)或共同算法的若干个方法应该归在同一个类身上,这种设计体现了高聚类和程序的健壮性。
  • 同步互斥不是在线程上实现,而是在线程访问的资源上实现,线程调用资源。

例子: 子线程循环5次,主线程循环10次,如此交替50次

设计:

使用一个Business类来包含子线程和主线程要运行的代码,从而,该类的对象成为加锁的对象。同步互斥在该类实现,由线程调用该类的方法,即调用了资源。

代码:


/**
* Created by brian on 2016/2/4.
*/
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防止伪唤醒