摘要:大家好,我是乐字节的小乐,好看好学的干货又来了上一篇我们说到了多线程的概念以及优缺点,本文将接着说多线程的创建,以及多线程的状态。
大家好,我是乐字节的小乐,好看好学的Java干货又来了!上一篇我们说到了Java多线程的概念以及优缺点,本文将接着说Java多线程的创建,以及多线程的状态。
一、创建线程 1、创建 Thread 的子类创建: 继承 Thread +重写 run
启动: 创建子类对象 对象.start()
创建 Thread 子类的一个实例并重写 run 方法,run 方法会在调用 start()方法之后被执行,示例如下:
public class MyThread extends Thread { public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20); //模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一边学习多线程"); } } public static void main(String[] args) { //创建子类对象 MyThread myThread = new MyThread(); //启动线程 myThread.start(); //也可以创建匿名子类 Thread thread = new Thread(){ public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20);//模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一边玩QQ"); } } }; thread.start(); for(int i=0;i<10;i++){ try { Thread.sleep(20); //模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一边玩微信..."); } } }2、实现 Runnable 接口(推荐)
面向接口编程,避免单继承局限
创建: 实现 Runnable +重写 run
启动:静态代理 Thread
a)、创建真实角色 实现类对象
b)、创建代理角色 Thread 对象+真实角色的引用
c)、代理角色.start()
此方式是新建一个实现了 java.lang.Runnable 接口的类的实例,实例中的方法可以被
线程调用。
缺点: 根据重写规则,run 方法不能对外声明异常,不能有返回值
public class MyRunnable implements Runnable { public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20); //模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一边学习多线程"); } } public static void main(String[] args) { //使用代理创建线程 Thread thread = new Thread(new MyRunnable()); //启动线程 thread.start(); //也可以创建一个实现了Runnable接口的匿名类 Runnable myRunnable = new Runnable(){ public void run(){ for(int i=0;i<10;i++){ try { Thread.sleep(20);//模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一边玩QQ"); } } }; Thread t = new Thread(myRunnable); t.start(); for(int i=0;i<10;i++){ try { Thread.sleep(20); //模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一边玩微信..."); } } }
优点: 能声明异常,能有返回值 缺点: 编写复杂麻烦
public class Call { public static void main(String[] args) throws InterruptedException, ExecutionException { //创建线程 ExecutorService ser=Executors.newFixedThreadPool(2); Race tortoise = new Race("老不死",1000); Race rabbit = new Race("小兔子",500); //获取值 Future二、线程的状态及信息 1、五种状态result1 =ser.submit(tortoise) ; Future result2 =ser.submit(rabbit) ; Thread.sleep(2000); //2秒 tortoise.setFlag(false); //停止线程体循环 rabbit.setFlag(false); int num1 =result1.get(); int num2 =result2.get(); System.out.println("乌龟跑了-->"+num1+"步"); System.out.println("小兔子跑了-->"+num2+"步"); //停止服务 ser.shutdownNow(); } } class Race implements Callable { private String name ; //名称 private long time; //延时时间 private boolean flag =true; private int step =0; //步 public Race() { } public Race(String name) { super(); this.name = name; } public Race(String name,long time) { super(); this.name = name; this.time =time; } @Override public Integer call() throws Exception { while(flag){ Thread.sleep(time); //延时 step++; } return step; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public int getStep() { return step; } public void setStep(int step) { this.step = step; } }
1)、新生状态: new
2)、就绪状态: runnable
3)、运行状态: running
4)、阻塞状态: blocked
5)、执行完毕: dead
类似于运动员赛跑,
1)、新生状态:选出运动员
2)、就绪状态:走到起跑线,做好跑的动作,枪响后,不是马上就跑,得有反应时间。
3)、运行状态:反应完成后,开始跑
4)、阻塞状态:路边一个石头绊倒了,马上跑起来,嘟囔几句,踢踢石头, 不是马上跑,重新反应进入就 绪。
5)、终止状态:跑完了,结束了,慢慢的走几步停下来。
模拟网络延时,每个对象 都有一把排他锁,不会释放锁
class Web12306 implements Runnable { private int tickets =20; //假设20张票 private boolean flag =true; @Override public void run() { while(flag){ if(tickets>=0){ try { //模拟延时 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->抢票"+tickets--); }else{ flag =false; } } } public static void main(String[] args) { //真实角色 目标 Runnable target =new Web12306(); //代理角色 Thread +真实角色的引用 Thread proxy1 =new Thread(target,"黄牛A"); Thread proxy2 =new Thread(target,"路人甲"); //代理行为 proxy1.start(); //启动线程 proxy2.start(); //线程不安全,数据有问题 } }3、终止
不要调用 stop destory 方法 ,太暴力,一盆冷水让其停止。
a、正常执行完毕,循环 次数已经到达
b、外部干涉
1)、线程中加入标识 -->属性
2)、线程体中 使用改标识 -->死循环
3)、对外提供改变改标识的方法 setXxx() terminate() a()...
4)、外部根据适当的时机调用该方法
Thread.currentThread()
5、优先级只代表概率,不代表绝对先后顺序
MIN_PRIORITY : 1
NORM_PRIORITY :5 默认优先级
MAX_PRIORITY :10
getPriority() setPriority()
关于多线程的创建和状态就介绍到这里,下次我们再说多线程的同步和线程通信,请关注乐字节,原创文章,转载请注明出处。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75975.html
摘要:注意很多多线程是模拟出来的,真正的多线程是指有多个,即多核如服务器。对于目前的大家来说,线程掌握以下即可创建线程的方式停止线程简单的关于多线程的概念和优缺点就介绍到这,下一篇将会讲讲如何创建多线程。 大家好,乐字节小乐有来咯,上次说完了Java网络编程探究|乐字节,这次我们来看看线程相关的吧。 Java线程主要讲述的内容有:showImg(https://segmentfault.co...
摘要:换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。 大家好,我是乐字节小乐,上次给大家讲述了Java中的IO流之输出流|乐字节,本文将会给大家讲述网络编程。 主要内容如下: 网络 网络分层 列表项目 IP位置 端口port 网络编程 showImg(https://segmentfault.c...
摘要:上次是说到了多线程的创建和状态乐字节,接下来,我们再来接着说多线程同步和线程通信生产者消费者模式。另一方面,线程通信使线程能够等待其他线程的信号。 大家伙周末愉快,小乐又来给大家献上技术大餐。上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式。 一、同步:synchronized 多个线程同...
摘要:一反射机制概念程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,如,是动态语言显然,,不是动态语言,但是有着一个非常突出的动态相关机制。相关的为二获取源头重点打开权限所有类的对象其实都是的实例。 一、Java反射机制概念 程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,如Python, Ruby是动态语言;显然C++,Java,C#不是动态语言,但是JAVA有...
摘要:上一篇文章,小乐给大家带来了新特性之,接下来本文将会给大家介绍新特性之前言通过发布新的来进一步加强对日期与时间的处理。 上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期与时间的处理。 旧版的 Java 中,日期时间 API 存在诸多问题...
阅读 1079·2023-04-26 03:02
阅读 1121·2023-04-25 19:18
阅读 2565·2021-11-23 09:51
阅读 2539·2021-11-11 16:55
阅读 2565·2021-10-21 09:39
阅读 1652·2021-10-09 09:59
阅读 1971·2021-09-26 09:55
阅读 3491·2021-09-26 09:55