博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程之传统多线程
阅读量:7234 次
发布时间:2019-06-29

本文共 2725 字,大约阅读时间需要 9 分钟。

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:

例子:一个定时器实现交替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防止伪唤醒

转载地址:http://utmfm.baihongyu.com/

你可能感兴趣的文章
VMware ESXi 5 whitebox NIC support
查看>>
如何使用单机单网卡实现公司内、外网访问
查看>>
java 设计模式 学习笔记(四)工厂模式
查看>>
初探oVirt-清理ovirt环境
查看>>
rabbitMQ日常管理(转)
查看>>
SEO的作用是什么?为什么要学习SEO?
查看>>
记录历史命令,history,命令补全和别名、通配符、输入输出重定向
查看>>
java.sql.SQLException: No more data to read from socket
查看>>
我的友情链接
查看>>
对于IE6、IE7、Firefox兼容性的一些观点
查看>>
思科网络技术
查看>>
VS2010 生成Xml格式的注释文档
查看>>
【Linux】Linux操作系统期末复习笔记
查看>>
bat 编程语法
查看>>
shell模拟多线程,moreping(备份)
查看>>
常用命令
查看>>
公司建立DHCP服务器,但下面用户还是无法自动获取IP地址
查看>>
GDI+ 学习记录(13): 弧线 - Arc
查看>>
arping命令详解
查看>>
【Java每日一题】20170313
查看>>