博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程、多线程同步、线程之间的通信
阅读量:5931 次
发布时间:2019-06-19

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

多线程,可以这样理解:

读一本书为一个线程,听一首歌为一个线程。当我们同时做这两件事的时候,要么听了歌曲,读完了书却不记得读了什么,或者读了书,却没有记住歌曲听的是什么。

CPU可以比作是大脑,读书和听音乐都是线程,每次CPU都只能执行一个线程,执行完一个线程才会执行下一个线程

 

Java中主要提供了两种方式实现线程:分别为继承java.lang.Therad类 和实现 java.lang.Runnable接口

 

Therad类:

为了方便查看   我将两个个类中的东西都写到了一起,中间用*******隔开的

package com.maya.Test;public class MaYi extends Thread {    private String name;         //成员变量    public MaYi(String name){        //构造函数        this.name=name;            }        public void run(){                //run方法  线程执行的内容要写在这里面                while(true){                        try {                    Thread.sleep(2000);                        //延迟2000毫秒                }                 catch (InterruptedException e) {                    e.printStackTrace();                }                    System.out.println(this.name+"蚂蚁正在下载");                }            }}********************************************************************************************************package com.maya.Test;public class Test {    public static void main(String [] args){                MaYi my1=new MaYi("蚂蚁一号");            //造新的线程        my1.start();                MaYi my2=new MaYi("蚂蚁二号");        my2.start();                MaYi my3=new MaYi("蚂蚁三号");        my3.start();                MaYi my4=new MaYi("蚂蚁四号");        my4.start();                            }}

输出的结果如下

由此可以看出,多个线程同时执行时,并没有按照固定的顺序来执行,而是抢占CPU来执行自身,哪个抢到,哪个先执行

 

Runnable 接口

package com.maya.Test;public class TuZi implements Runnable {    private String name;        public TuZi(String name){        this.name=name;    }        @Override    public void run() {        while(true){                        try {                Thread.sleep(2000);            }            catch (InterruptedException e) {                e.printStackTrace();            }                        System.out.println(this.name+"兔子在跑");        }    }}**************************************************************************************************package com.maya.Test;public class Test {    public static void main(String [] args){                TuZi t=new TuZi("1号");        Thread d=new Thread(t);        d.start();                TuZi t2=new TuZi("2号");        Thread d2=new Thread(t2);        d2.start();                TuZi t3=new TuZi("3号");        Thread d3=new Thread(t3);        d3.start();                    }}

在控制台中的结果同上;

 

多线程同步块:synchronized(参数){}

假设兔子3只兔子一共跑了100米,想要三个线程同步,即一只兔子跑了x米,其他兔子继续跑剩下的米数;

package com.maya.Test;public class TuZiPao extends Thread {        private static int changdu=100;    private String name;    private Object obj;        public TuZiPao(String name, Object obj){                this.name=name;        this.obj =obj;            }            public void run(){            while(true){                                synchronized (obj) {    //这里的obj相当于是一把钥匙                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    // TODO 自动生成的 catch 块                    e.printStackTrace();                }                changdu--;                if(changdu<=0){                    System.out.println("已经跑完了全程");                    break;                }            System.out.println(name+"兔子跑了一米,还剩下"+changdu );                                                                }                                    }    }    }**************************************************************************************************package com.maya.Test;public class Test {    private  Object obj;    public static void main(String [] args){                Object obj=new Object();        TuZiPao t=new TuZiPao("1号", obj);        Thread d=new Thread(t);        d.start();                TuZiPao t2=new TuZiPao("2号",obj);        Thread d2=new Thread(t2);        d2.start();                TuZiPao t3=new TuZiPao("3号",obj);        Thread d3=new Thread(t3);        d3.start();                    }}

 

 线程的7种状态:  新生,就绪,执行,等待,休眠,死亡,阻塞

新生:new出来的时候

Therad s=new Therad();

就绪:start()

a.start()

执行:run()函数中的内容

public void run() {        while(true){                        try {                Thread.sleep(2000);            }            catch (InterruptedException e) {                e.printStackTrace();            }                        System.out.println(this.name+"兔子在跑");        }    }

等待:notify()或者notifyall()

a.notify()

休眠 : therad.sclle(2000)

死亡 :线程结束

阻塞

转载于:https://www.cnblogs.com/zhaotiancheng/p/6279817.html

你可能感兴趣的文章
删除底部"自豪地采用 WordPress"
查看>>
i897刷机原理分析
查看>>
第二次作业
查看>>
JS判断IE浏览器的最简短方法
查看>>
SCAU 2018 初出茅庐 题解
查看>>
Python 正则表达式爬取浏览目录
查看>>
Spring Boot脚手架
查看>>
python 多线程编程之进程和线程基础概念
查看>>
(一)cacti的原理
查看>>
基与维数
查看>>
BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
查看>>
crosses initialization of “XXX” 的问题
查看>>
linux 入门
查看>>
JS常用几种存储方式的使用规则与各自特征
查看>>
MPP(大规模并行处理)
查看>>
第二次作业
查看>>
How Many to Be Happy? Gym - 101667E
查看>>
(字节跳动冬令营网络赛)H-Accel World(弗洛伊德最短路+图DP)
查看>>
行编辑时点击空白或切换行保存
查看>>
js内存泄露相关
查看>>