2019-05-12

多线程

定义:多任务同时执行就是多线程,如果没有任务,就不需要使用多线程

线程和进程之间的区别:

进程:资源分配的最小单位

线程:cpu调度的最小单位

  一个进程可以包含1~n个线程

线程开启的方式:

1.继承Thread类,重写run()方法 (重要)

创建子类对象,调用start()方法,开启多线程

2.实现Runnable接口,重写run()方法 **(重要)

3.实现Callable接口,重写call()方法 (了解)

方法1:

继承Thread类,重写run()方法 (重要)

创建子类对象,调用start()方法,开启多线程

1、public class ThreadDemo01 extends Thread{}

自定义类extends(继承)了Thread类;

2、@Override

public void run() {

for(int i=1;i<=100;i++){

System.out.println("  ");}}

重写Thread中的run()方法;

3、主程序启动线程

public static void main(String[] args) {

ThreadDemo01 th=new ThreadDemo01();

//void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

// th.start();  //开启线程

// th.run();

for(int i=1;i<=100;i++){

System.out.println("    ");

}

th.start(); //注意:不能把启动线程的程序放在后面,这样就会多次调用线程启动。

}

缺点:假如这个程序已经继承了其它的类,就不能再继承Thread类。

方法2:

实现Runnable接口,重写run()方法 **(重要)

开启线程: Thread类做代理,调用Thread类中的start方法开启线程

优点:

避免了单继承的局限性

实现资源共享

方法:

1、调用(implement ),Runnable接口;

public class ThreadDemo02 implements Runnable{

2、重写Runnable里面的run方法;

@Override

public void run() {

for(int i=1;i<=100;i++){

System.out.println("        ");

}

}

3、在主程序里面创建线程对象,实现了Runnable接口作为参数传入,简写:Thread  t=new Thread(new ThreadDemo02());

public static void main(String[] args) {

ThreadDemo02 th=new ThreadDemo02();

Thread t=new Thread(th);

//void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

t.start();  //开启线程

for(int i=1;i<=100;i++){

System.out.println("    ");

}

}

}

线程状态

新生状态:new线程对象的时候,这个线程处于新生状态

就绪状态:调用start()方法,线程进入就绪状态,进入到就绪队列,进入就绪状态代表线程有能力执行,但是要等到cpu调用,分配时间片才能执行

运行状态:当前cpu调度,分配时间片给就绪状态的线程,当前线程执行

阻塞状态:sleep...

终止状态:结束

  1.如果线程一旦进入到阻塞状态不会直接进入运行状态,阻塞状态解除要进入到就绪状态

  2.线程一个旦结束,无法恢复,如果重新开启,也是一个新的线程

* 如何控制线程的终止:

1.调用stop(),destory(),已过时,不推荐

2.线程正常执行结束

3.添加标识控制

* 进入线程就绪状态的几种情况:

* 1.start()方法

* 2.yield 礼让线程

* 3.线程之前切换

* 4.解除阻塞状态,线程进入到就绪状态

*

* 进入线程阻塞状态的几种情况:

1.sleep方法

2.join方法

3.wait方法

4.IO操作

暂停线程执行的sleep()和yield()方法

Sleep()能够通过设置时间,让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态;

Yield()让正在运行的线程直接进入就绪状态,让出CPU的使用权; 

知识点:extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,extends只能继承一个类,implements可以实现多个接口。

方法:Thread.sleep(1000)    设置等待时间1000毫秒;

      Thread.yield();  可引起线程的切换

联合线程join()俗称插队

Join()方法的案例

Thread th =new Thread(new son());

th.start();

try {

th.join();

} catch (InterruptedException e) {

e.printStackTrace();

System.out.println("儿子丢了");

}

System.out.println("喝茶");

    如上th.join() 表示另外一个儿子的线程插队进来了,必须要一定要让儿子的行为结束才能执行父类的线程的最后一步。

线程的状态和优先级

查看线程的状态:

* Thread.State getState()  返回该线程的状态。

*

* 线程优先级:

* void setPriority(int newPriority) 更改线程的优先级。

*  int getPriority() 返回线程的优先级

*  1~10表示  1是最小  10是最大  默认是5

*  MIN_PRIORITY 最小

*  NORM_PRIORITY 默认

*  MAX_PRIORITY 最大

线程的常用方法:

isAlive()        判断线程是否还玩终止,也就是在运行中,或者;

getPriority()  取得线程的优先级数值

setPriority()  设置线程的优先级数值

setName()  给线程一个名字

getName()  取得线程的名字

currentThread()  取得当前正在运行的线程的对象

线程安全(线程同步等待机制)

多个线程同时操作同一份资源的时候,可能会发生线程不安全问题

* 控制线程安全:加锁  synchronized 同步

* 同步方法: 在方法上面加锁

* 同步静态方法

* 同步成员方法

* 同步块: synchronized(){}

* 锁this,锁资源,锁类

*  锁的必须是不变的内容

*  锁的范围太大,效率低,锁的范围太小,容易锁不住

*  单例:懒汉式是线程不安全的

线程同步

由于一个进程的多个线程共享同一块存储空间,为了避免同一个数据对象被多个线程访问造成问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,454评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,957评论 1 18
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,677评论 0 12
  • 多线程-thread Thread类和Runnable接口都在java.lang包中。 内容: 1.多线程的基本概...
    可乐W阅读 439评论 0 0
  • 一、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf阅读 337评论 0 1