《小白兔到大黑牛》第九篇多线程实现的俩种方式
来源:互联网 发布:当今网络世界强国 编辑:程序博客网 时间:2024/04/28 05:31
/**
* Created by ch on 17-7-16.
* java 多线程 锁机制
*
* 多线程
*(1)多线程具有的五个基本状态
* 1.新建状态(new):对象被创建后,进入了新的状态,Thread thread=new Thread();
* 2.就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进
* 入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,
* 并不是说执行了t.start()此线程立即就会执行;
* 3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。
* 4.阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,
* 直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、
join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
*
*二.java中线程创建的俩种基本形式
* 1.继承Thread重写run方法.
*
*/
class MyThread extends Thread { private int i = 0; @Override public void run() { for (i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } }}public class ThreadTest { public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if (i == 30) { Thread myThread1 = new MyThread(); // 创建一个新的线程 myThread1 此线程进入新建状态 Thread myThread2 = new MyThread(); // 创建一个新的线程 myThread2 此线程进入新建状态 myThread1.start(); // 调用start()方法使得线程进入就绪状态 myThread2.start(); // 调用start()方法使得线程进入就绪状态 } } }}
2.实现Runnable接口并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例
并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象.
class MyRunnable implements Runnable { private int i = 0; @Override public void run() { for (i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } }}public class ThreadTest { public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if (i == 30) { Runnable myRunnable = new MyRunnable(); // 创建一个Runnable实现类的对象 Thread thread1 = new Thread(myRunnable); // 将myRunnable作为Thread target创建新的线程 Thread thread2 = new Thread(myRunnable); thread1.start(); // 调用start()方法使得线程进入就绪状态 thread2.start(); } } }}
- 《小白兔到大黑牛》第九篇多线程实现的俩种方式
- 《小白兔到大黑牛》第三篇冒泡排序实现
- 《小白兔到大黑牛》第二篇基于源码自己实现简单的ArrayList中简单方法
- 《小白兔到大黑牛》第四篇运用递归法 增强for实现子孙级文件夹的遍历
- 《小白兔到大黑牛》第十二篇centous 7命令的总结
- 《小白兔到大黑牛》第十五篇Hadoop五个进程的联系
- 小白兔的笑话
- 小白兔的故事
- 小白兔的故事
- 小白兔的故事
- 《小白兔到大黑牛》第五篇手写Json
- 小白兔的小笑话
- 小白兔的求职遭遇
- 《小白兔到大黑牛》第八篇结合TCP 知识写一个简单的聊天
- 《小白兔到大黑牛》第十三篇maven中Hadoop中类的练习
- 《小白兔到大黑牛》第十一篇yum命令的总结
- 《小白兔到大黑牛》第七篇UDP与TCP理论
- 《小白兔到大黑牛》第十篇锁机制基础知识
- mysql数据库
- 多态的实现机制
- android进程回收
- 获取手机内部所有AppInfo
- x264源代码简单分析:x264命令行工具(x264.exe)
- 《小白兔到大黑牛》第九篇多线程实现的俩种方式
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
- MiniSQL设计
- ubuntu下caffe清理空间&caffe在训练的时候loss不继续下降了应该怎么做
- JS 数据监听方法研究
- 字符设备驱动基础篇3——字符设备驱动工作原理
- RuquestMapp value值
- 函数
- css的margin、padding和布局定位