多线程之传统多线程

Contents

传统线程技术

传统创建线程方式

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

Thread t = new Thread();
t.start();

2.实现Runnable接口

Runnable不是线程,是线程要运行的代码的宿主。

1.看看Thread类源码,捋清Runnable,target,run,start关系

  • Runnable是一个接口
  • targetThread类中类型为Runnable,名为target的属性
  • runThread类实现了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防止伪唤醒

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩伟的专栏

在C++中模拟JAVA内部类的方法

有时候我们需要把一批互相关联的API用不同的类提供给用户,以便简化每个类的使用难度。但是这样这些类之间的数据共享就成了问题。JAVA的内部类可以自由的访问外围类...

27940
来自专栏Golang语言社区

Go语言的指针 & *

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。...

30650
来自专栏LEo的网络日志

python技巧分享(四)

29390
来自专栏进击的君君的前端之路

设计模式

14720
来自专栏码云1024

c++ Struct和Class的区别

32630
来自专栏CodingToDie

java 反射

反射 前言 当我们使用框架带给我们的开发上的便利的时候,其内部的运行机制应该是什么样的呢? 例如:在ORM框架中,如何将 bean与 数据库表进行关联, 字段 ...

32930
来自专栏cloudskyme

设计模式(8)-状态模式(关注状态之间的变化)

状态模式(State Pattern)是设计模式的一种,属于行为模式。 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这...

38670
来自专栏C/C++基础

C++中mutable关键字的用法

mutalbe的中文意思是“可变的,易变的”,是constant(即C++中的const)的反义词。在C++中,mutable也是为了突破const的限制而设置...

6310
来自专栏决胜机器学习

设计模式专题(六)——原型模式

设计模式专题(六) ——原型模式 (原创内容,转载请注明来源,谢谢) 一、含义 原型模式(Prototype)是用原型实例指定创建对象的种类,并且通过拷贝这些...

36380
来自专栏微信公众号:Java团长

优秀Java程序员的编程风格

今天突发奇想,对编码习惯和编程风格很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助!

8920

扫码关注云+社区

领取腾讯云代金券