Java------Thread线程

基本概念

  • 多线程是指多条路径同时执行
  • 三高:
    1)高可用 2)高性能 3)高并发
  • 创建线程方法3种:
    1)继承Thread类
    2)实现Runnable接口
    3)实现Callable接口

继承Thread类

  • 继承Thread的方式实现多线程
  • 步骤:
    1.创建:继承Thread+重写run方法
    2.启动:创建子类对象+start
package com.briup.thread;
/*** 继承Thread的方式实现多线程* 1.创建:继承Thread+重写run方法* 2.启动:创建子类对象+start* @author Vijay**/
public class TestThread extends Thread{/*** 线程入口点*/@Overridepublic void run() {for(int i = 0;i<11;i++) {System.out.println("这是多线程的逻辑代码"+i);}}public static void main(String[] args) {//创建子类对象TestThread tt = new TestThread();//启动tt.start();//开启多线程
//      tt.run();//普通方法调用for(int i = 0;i<10;i++) {System.out.println("--------------"+i);}}
}

实现Runnable接口

  • 继承Thread的方式实现多线程(推荐使用)
  • 避免单继承的局限性,优先使用接口
  • 步骤:
    1.创建:实现Runnable+重写run方法
    2.启动:创建实现类对象+Thread对象+start
package com.briup.thread;
/*** 继承Thread的方式实现多线程* 1.创建:实现Runnable+重写run方法* 2.启动:创建实现类对象+Thread代理类对象+start* @author Vijay**/
public class TestRunnable implements Runnable {/*** 线程入口点*/@Overridepublic void run() {for(int i = 0;i<11;i++) {System.out.println("这是多线程的逻辑代码"+i);}}public static void main(String[] args) {/*//创建实现类对象TestRunnable tr = new TestRunnable();//创建代理类对象Thread t = new Thread(tr);//启动t.start();//开启多线程
*/      new Thread(new TestRunnable()).start();for(int i = 0;i<10;i++) {System.out.println("--------------"+i);}}
}

抢票+龟兔赛跑

抢票

run()方法没有返回值,不能对外抛出异常

package com.briup.thread;
/*** 抢票* 共享资源,并发(线程安全)* @author Vijay**/
public class Web12306 implements Runnable {//票数private int ticketNums = 99; @Overridepublic void run() {while(true) {if(ticketNums<=0) {break;}//模拟网络延迟,会出现数据问题
//          try {//              Thread.sleep(100);
//          } catch (InterruptedException e) {//              e.printStackTrace();
//          }System.out.println(Thread.currentThread().getName()+"--"+ticketNums--);}}public static void main(String[] args) {//一份资源Web12306 web = new Web12306();//多个代理new Thread(web,"黄小牛").start();new Thread(web,"黄二牛").start();new Thread(web,"黄老牛").start();}
}

龟兔赛跑

package com.briup.thread;
/*** 龟兔赛跑* @author Vijay**/
public class Racer implements Runnable {private static String winner;//胜利者@Overridepublic void run() {for (int steps = 0; steps <= 100; steps++) {System.out.println(Thread.currentThread().getName()+"--"+steps);//判断比赛是否结束boolean flag = gameOver(steps);if(flag) {break;}}}private boolean gameOver(int steps) {if(winner != null) {//存在胜利者return true;}else if(steps == 100){winner = Thread.currentThread().getName();System.out.println("winner==>"+winner);return true;}else {return false;}}public static void main(String[] args) {Racer racer = new Racer();new Thread(racer,"兔子rabbit").start();new Thread(racer,"乌龟tortoise").start();}
}

实现Callable

  • 步骤:
  1. 创建目标对象
  2. 创建执行服务
  3. 提交执行
  4. 获取结果
  5. 关闭服务

静态代理设计模式

package com.briup.thread;
/*** 静态代理* 1、真实角色* 2、代理角色* @author Vijay**/
public class StaticProxy {public static void main(String[] args) {new WeddingCompany(new You()).happyMarry();//new Thread(线程对象).start();}
}
interface Marry{//  人生四大喜事:
//      久旱逢甘雨
//      他乡遇故知
//      洞房花烛夜
//      金榜题名时void happyMarry();
}
//真实角色
class You implements Marry{@Overridepublic void happyMarry() {System.out.println("你和嫦娥奔月了");}
}
//代理角色
class WeddingCompany implements Marry{//真实角色private Marry target;public WeddingCompany(Marry target) {this.target = target;}@Overridepublic void happyMarry() {ready();this.target.happyMarry();after();}private void ready() {System.out.println("布置房间");}private void after() {System.out.println("闹洞房");}
}

线程状态

  • 进入就绪状态
  1. start();
  2. 阻塞状态解除
  3. yield();
  4. jvm从本地线程切换到其他线程
  • 进入阻塞状态
  1. sleep();
  2. wait();
  3. join();
  4. read(); write();

线程停止

package com.briup.thread;
/*** 终止线程* 外部控制线程的终止* 1、线程正常执行完毕-->次数* 2、外部干涉-->加入标识* 不要使用stop,destory* @author Vijay**/
public class TerminateThread implements Runnable {//1、加入标识,标记线程体是否可以运行private boolean flag = true;private String name;public TerminateThread(String name) {this.name=name;}@Overridepublic void run() {int i = 0;//2、关联标识,true-->运行   false-->停止while(flag) {System.out.println(name+"-->"+i++);}}//3、对外提供方法改变标识public void terminate() {this.flag=false;}public static void main(String[] args) {TerminateThread tt = new TerminateThread("C罗");new Thread(tt).start();for (int i = 0; i < 100; i++) {if(i==88) {tt.terminate();//线程的终止System.out.println("tt Game Over");}System.out.println("main-->"+i);}}}

sleep暂停

  1. sleep(时间)指定当前线程阻塞的毫秒数
  2. sleep存在异常InterruptedException
  3. sleep时间达到后进入就绪状态
  4. sleep可以模拟网络延时、倒计时等
  5. 每一个对象都有一个锁,sleep不会释放锁
  • sleep模拟网络延时
package com.briup.thread;
/*** sleep模拟网络延时,放大了发生问题的可能性* @author Vijay**/
public class BlockedSleep01 {public static void main(String[] args) {//一份资源Web123306 web = new Web123306();System.out.println(Thread.currentThread().getName());//多个代理new Thread(web,"黄小牛").start();new Thread(web,"黄二牛").start();new Thread(web,"黄老牛").start();}
}
class Web123306 implements Runnable {//票数private int ticketNums = 99; @Overridepublic void run() {while(true) {if(ticketNums<=0) {break;}//模拟网络延迟,会出现数据问题try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"--"+ticketNums--);}}
}
  • sleep模拟休息
package com.briup.thread;
/*** sleep模拟休息* @author Vijay**/
public class BlockedSleep02 implements Runnable{private static String winner;//胜利者@Overridepublic void run() {for (int steps = 0; steps <= 100; steps++) {//sleep模拟休息if(Thread.currentThread().getName().equals("rabbit")&&steps%10==0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName()+"--"+steps);//判断比赛是否结束boolean flag = gameOver(steps);if(flag) {break;}}}private boolean gameOver(int steps) {if(winner != null) {//存在胜利者return true;}else if(steps == 100){winner = Thread.currentThread().getName();System.out.println("winner==>"+winner);return true;}else {return false;}}public static void main(String[] args) {Racer racer = new Racer();new Thread(racer,"兔子rabbit").start();new Thread(racer,"乌龟tortoise").start();}
}
  • sleep模拟倒计时
package com.briup.thread;import java.text.SimpleDateFormat;
import java.util.Date;/*** sleep模拟倒计时* @author Vijay**/
public class BlockedSleep03 {public static void main(String[] args) throws InterruptedException {//倒计时Date endTime = new Date(System.currentTimeMillis()+1000*10);long end = endTime.getTime();while(true) {System.out.println(new SimpleDateFormat("mm:ss").format(endTime));Thread.sleep(1000);endTime = new Date(endTime.getTime()-1000);if(end-10000>endTime.getTime()) {break;}}}
}

yield退让

  • yield
    运行状态–>就绪状态
package com.briup.thread;
/*** yield();* 礼让线程,直接进入就绪状态不是阻塞状态* @author Vijay**/
public class YieldDemo01 {public static void main(String[] args) {MyYield my = new MyYield();new Thread(my,"a").start();new Thread(my,"b").start();}
}
class MyYield implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"-->start");Thread.yield();System.out.println(Thread.currentThread().getName()+"-->end");}
}
package com.briup.thread;
/*** yield();* 礼让线程,直接进入就绪状态不是阻塞状态* @author Vijay**/
public class YieldDemo02 {public static void main(String[] args) throws InterruptedException {new Thread(()->{for (int i = 0; i < 100; i++) {System.out.println("lambda..."+i);}}).start();for (int i = 0; i < 100; i++) {if(i%20==0) {Thread.yield();}System.out.println("main..."+i);}}
}

join加入

  • join
    插入的线程结束,被插的线程才能执行
package com.briup.thread;
/*** join:合并线程,插队线程* @author Vijay**/
public class JoinDome01 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{for (int i = 0; i < 100; i++) {System.out.println("lambda..."+i);}});t.start();for (int i = 0; i < 100; i++) {if(i==20) {t.join();//插队 main被阻塞了}System.out.println("main..."+i);}}
}
package com.briup.thread;
/*** join:儿子为爸爸买烟* @author Vijay**/
public class JoinDome02 {public static void main(String[] args) throws InterruptedException {System.out.println("儿子为爸爸买烟");Thread tt = new Thread(new Father());tt.start();}
}class Father extends Thread{@Overridepublic void run() {System.out.println("想抽烟,发现没烟了");System.out.println("让儿子去买中华");Thread t = new Thread(new Son());t.start();try {t.join();//father被阻塞} catch (InterruptedException e) {e.printStackTrace();System.out.println("儿子走丢了,老爸找儿子去了");}System.out.println("老爸接过烟,把零钱给了儿子");}
}class Son extends Thread{@Overridepublic void run() {System.out.println("接过老爸的钱");System.out.println("路边有个游戏厅,玩了10秒");for (int i = 1; i < 11; i++) {System.out.println(i+"秒过去了");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("赶紧买烟去");System.out.println("买上烟回家");}
}

priority

package com.briup.thread;
/*** 线程的优先级 1-10* 1、NORM_PRIORITY 5 默认* 2、MAX_PRIORITY 10 * 3、MIN_PRIORITY 1* 概率 不代表优先顺序* @author Vijay**/
public class PriorityTest {public static void main(String[] args) {MyPriority mp = new MyPriority();Thread t1 = new Thread(mp);Thread t2 = new Thread(mp);Thread t3 = new Thread(mp);Thread t4 = new Thread(mp);Thread t5 = new Thread(mp);Thread t6 = new Thread(mp);//设置优先级在启动前t1.setPriority(Thread.MAX_PRIORITY);t2.setPriority(Thread.MIN_PRIORITY);t3.setPriority(Thread.MAX_PRIORITY);t4.setPriority(Thread.MIN_PRIORITY);t5.setPriority(Thread.MAX_PRIORITY);t6.setPriority(Thread.MIN_PRIORITY);t1.start();t2.start();t3.start();t4.start();t5.start();t6.start();}
}
class MyPriority implements Runnable {public void run() {System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());Thread.yield();}
}

daemon守护线程

  • 线程分为用户线程和守护线程
  • 守护线程为用户线程服务
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如后台记录操作系统、监控内存使用等
package com.briup.thread;
/*** 守护线程:是为用户线程服务的;jvm停止不用等待线程执行完毕* 默认:用户线程  jvm等待用户线程执行完毕才会停止* @author Vijay**/
public class DaemonTest {public static void main(String[] args) {God god = new God();Me you = new Me();Thread t = new Thread(god);Thread tt = new Thread(you);t.setDaemon(true);//将用户线程调整为守护线程t.start();tt.start();}
}class Me implements Runnable {@Overridepublic void run() {for (int i = 0; i < 365*100; i++) {System.out.println("happy life ^-^ ");}System.out.println("life is over >.<");}
}class God implements Runnable {@Overridepublic void run() {for (;true;) {System.out.println("bless you ^_^ ");}}
}

其他方法

  1. isAlive(); 判断线程是否还活着
  2. setName(); 给线程起一个名字
  3. getName(); 获取线程的名字
  4. currentThread(); 取得当前正在运行的线程对象,也就是获取自己本身
package com.briup.thread;
/*** 其他方法* @author Vijay**/
public class InfoTest {public static void main(String[] args) throws InterruptedException {//判断线程是否还活着System.out.println(Thread.currentThread().isAlive());//设置名称:真实角色+代理角色MyInfo my = new MyInfo("战斗机");Thread t = new Thread(my);t.setName("公鸡");t.start();Thread.sleep(1000);System.out.println(t.isAlive());}
}class MyInfo implements Runnable {private String name;public MyInfo(String name) {this.name = name;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"-->"+name);}
}

Java------Thread线程相关推荐

  1. java thread 线程_Java Thread类简述

    今天我们来看下java.lang.Thread这个类. 在学习Thread类之前,先看下线程相关知识:线程的几种状态.上下文切换,然后介绍Thread类中的方法的具体使用. 1.线程的状态 线程从创建 ...

  2. JAVA Thread线程异常监控

    一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...

  3. java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  4. Java 里的thread (线程)简介

    在Java里 thread 就是线程的意思. 说到线程的概念, 自然离不开另外两个词: 程序和进程. 从最基本的程序讲起: 一. 什么是程序(Program) 所谓程序, 就是1个严格有序的指令集合. ...

  5. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为

    Linux pthread 和 java thread 的是 / 非守护线程的行为 pthread_xxx 的函数并没有直接提供设置一个 pthread 为守护线程的 API 而 pthread_at ...

  6. android java thread_Android中断并重启一个Thread线程的简单方法

    这里简单的总结下(大概思路,没调试,可能会有错!): MyThread.java pulbic class MyThread implemets Thread{ @overide public voi ...

  7. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  8. Java多线程-线程的创建(Thread类的基本使用)

    文章目录 一. 线程和Thread类 1. 线程和Thread类 1.1 Thread类的构造方法 1.2 启用线程的相关方法 2. 创建第一个Java多线程程序 3. 使用Runnable对象创建线 ...

  9. What is Java thread priority? 什么是java线程优先级

    就一个小程序,运行一次输出结果不一样,这是因为线程调度方法不能确定,取决你当前操作系统的进程,线程调度优先级. 所以要想线程按一定的顺序运行,哪么只能选择Synchronized 互斥(对象锁)和 w ...

  10. Java创建线程Thread的两个方法

     Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生 ...

最新文章

  1. Javascript中二进制数据处理方法
  2. 如何修改可运行Jar包,如何反编译Jar包
  3. 【Linux 内核】进程管理 ( 进程相关系统调用源码分析 | fork() 源码 | vfork() 源码 | clone() 源码 | _do_fork() 源码 | do_fork() 源码 )
  4. 做折线图坐标轴数字_你做的柱状图太丑了,这些美化技巧教给你(收藏)
  5. IPFS: BitSwap协议(数据块交换)
  6. 【机器学习基础】浅谈为什么L2正则化有效
  7. python paramiko模块:远程执行命令及上传和下载
  8. lua 字符串分割_Lua 分隔字符串,可以设置指定分隔符
  9. 讲讲Print里面还有什么参数可以设置
  10. VB.NET项目技术总结
  11. linux 如何查看fb中分辨率_西门子S71200,如何在FB块中使用操作定时器?
  12. JavaScript 之 截取字符串函数
  13. arraycolumn php5.4以下怎么用,兼容php5.4和更低版本php的array_column公共方法
  14. 微信公众号-百度通用翻译API接入文档
  15. SPSS学习笔记(六)线性相关及回归
  16. 纯html加css象棋棋盘,纯CSS实现的国际象棋棋盘
  17. 把图片存/取至数据库
  18. 现实版《黑镜》上演!这位程序媛用 AI 让已故基友“永生”
  19. 吉林大学计算机李昕,本报新聘百名特约教工通讯员
  20. css基础--vertical-align

热门文章

  1. SQL Server 查询分析器使用(性能分析)
  2. javascript 一些常用的正则表达式(手机号码,邮箱,整数,身份证号码,车牌号,中文,只能是字母或者数字)
  3. No.179 念念随风上九霄
  4. 【文献阅读】 Fair Sequential Group Recommendations
  5. 数据中的知识发现KDD和机器学习概念
  6. Navicat导出excel数据量过大解决方案
  7. SQL实现占比、同比、环比指标分析
  8. 神经网络模型应用实例,神经网络模型数学建模
  9. Django REST framework的使用简单介绍
  10. 计算机毕业设计Java智能家电商城(系统+源码+mysql数据库+lw文档)