多线程之传统多线程详解编程语言

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;

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防止伪唤醒

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/13062.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论