您的位置:首页 > 编程语言 > Java开发

java基础巩固笔记(5)-多线程之传统多线程

2016-02-13 17:36 696 查看

java基础巩固笔记(5)-多线程之传统多线程

标签: java

java基础巩固笔记5-多线程之传统多线程

传统线程技术
传统创建线程方式

传统定时器技术

互斥

同步

传统线程技术

传统创建线程方式

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

[code]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
方法源码

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


Thread
类的
target
属性

[code]/* What will be run. */
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秒打印

[code]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类来包含子线程和主线程要运行的代码,从而,该类的对象成为加锁的对象。同步互斥在该类实现,由线程调用该类的方法,即调用了资源。

代码:

[code]/**
 * 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防止伪唤醒

作者@brianway更多文章:个人网站 | CSDN | oschina
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: