概要:
一:线程状态
(1)新生状态-》创建线程对象然后实现start()方法
(2)就绪状态
(3)运行状态-》cpu调度
(4)阻塞状态
(5)死亡状态
二:停止线程
1.自然终止:线程体正常运行完毕
2.外部干涉:
1)线程类中定义线程体的标识
2)线程体使用该标识
3)提供对外的方法改变该标识
4)外部根据条件调用该方法即可
三:阻塞
1.join:合并线程,Y.join(),则先执行Y对象里面的线程体
2.Thread.yield():暂停线程,当前的方法体
3.Thread.sleep():睡眠,模拟延时,但有可能出现数据异常,资源冲突
四:线程基本信息
isAlive():判断线程是否活着,是否未终止
getPriority():获取线程的优先级数据,优先级代表的是概率,并非绝对的先后顺序
setPriority():设置线程的优先级
setName():给线程取名字
getName():获取线程名字
currentThread():获取当前正在运行的线程对象,也就是取得自己本身
五:线程同步(线程并发)
synchronized->同步
(1)同步块:
synchronized(引用类型 || this || 类.class){}
(2)同步方法:
synchronized 方法名(){}
多个线程访问同一份资源,确保资源安全->线程安全
线程安全则效率低,反之
上代码了解一下:
(简单利用静态代理模式)
1.具体角色:
1 package com.test; 2 /*使用Runnable创建线程 3 * 1.使用静态代理模式实现启动多线程 4 * (1)创建真实角色 5 * (2)创建代理角色 6 */ 7 public class Singer implements Runnable { 8 9 @Override 10 public void run() { 11 System.out.println("歌手线程执行->歌手曹操准备上台唱歌。。"); 12 } 13 }
2.代理角色:保持对具体角色的引用
1 package com.test; 2 3 public class Agent implements Runnable{ 4 Singer singer=new Singer(); 5 Thread t1=new Thread(singer); 6 public Agent(Singer singer) { 7 super(); 8 this.singer = singer; 9 } 10 private void before() { 11 System.out.println("代理员线程执行->代理员已经准备好台前工作,歌手就绪!"); 12 } 13 private void after() { 14 System.out.println("代理员线程执行->代理员已经收拾完场地,护送歌手离开!"); 15 } 16 17 @Override 18 public void run() { 19 System.out.println("歌手线程未启动:"+t1.isAlive()); 20 before(); 21 t1.start(); 22 t1.setName("歌手线程"); 23 System.out.println("当前线程为:"+t1.currentThread()); 24 System.out.println("当前线程名称:"+t1.getName()); 25 System.out.println("歌手线程启动:"+t1.isAlive()); 26 //这里存在多线程运行的延时,即代理员的线程可能运行在歌手的线程前面 27 after(); 28 } 29 }
3.场景模拟:
1 package com.test; 2 /* 3 * 场景模拟:实现多线程的启动 4 */ 5 public class Client { 6 7 public static void main(String[] args) throws InterruptedException { 8 //具体角色 9 Singer singer=new Singer(); 10 //代理角色 11 Agent ag=new Agent(singer); 12 Thread p2=new Thread(ag); 13 //启动线程 14 p2.start(); 15 } 16 }
效果截图:
ps:文章仅作学习了解,如有不对之处欢迎大佬指正。
原文:https://www.cnblogs.com/weekstart/p/10821534.html