关于java中的多线程
来源:互联网 发布:数据库证书哪个好考 编辑:程序博客网 时间:2024/06/05 03:37
1、线程的5种状态
(1)、创建状态:即创建线程,Thread thread=new Thread();
(2)、就绪状态:创建线程对象后调用start()方法,即可启动线程,当线程启动时,线程就进入的就绪状态。线程将进入线程队列排队,等待CPU服务。
(3)、运行状态:就绪状态被调用,线程就进入了运行状态,会自动调用该线程的run()方法。
(4)、阻塞状态:在运行状态下如果调用了sleep()、wait()、suspend()等方法线程都将会进入阻塞状态,只有阻塞原因消除后,线程才可以进入到就绪状态。
(5)、死亡状态:当调用了stop()方法,或者run()方法执行完毕后,线程就进入了死亡状态
java程序每次启动时,至少启动两个线程,分别是main线程和垃圾回收机制
2、中断线程
当一个线程运行时,另外一个线程可以直接通过interrupt()方法中断其运行状态。
class MyThread implements Runnable{ // 实现Runnable接口 public void run(){ // 覆写run()方法 System.out.println("1、进入run()方法") ; try{ Thread.sleep(10000) ; // 线程休眠10秒 System.out.println("2、已经完成了休眠") ; }catch(InterruptedException e){ System.out.println("3、休眠被终止") ; return ; // 返回调用处 } System.out.println("4、run()方法正常结束") ; } }; public class ThreadInterruptDemo{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 实例化Runnable子类对象 Thread t = new Thread(mt,"线程"); // 实例化Thread对象 t.start() ; // 启动线程 try{ Thread.sleep(2000) ; // 线程休眠2秒 }catch(InterruptedException e){ System.out.println("3、休眠被终止") ; } t.interrupt() ; // 中断线程执行 } };
3、后台线程
在 Java 程序中,只要前台有一个线程在运行,则整个 Java 进程都不会消失,所以此时可以设置一个后台线程,这样即使 Java 线程结束了,此后台线程依然会继续执行,要想实现这样的操作,直接使用 setDaemon() 方法即可。
class MyThread implements Runnable{ // 实现Runnable接口 public void run(){ // 覆写run()方法 while(true){ System.out.println(Thread.currentThread().getName() + "在运行。") ; } } }; public class ThreadDaemonDemo{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 实例化Runnable子类对象 Thread t = new Thread(mt,"线程"); // 实例化Thread对象 t.setDaemon(true) ; // 此线程在后台运行 t.start() ; // 启动线程 } };
4、线程同步
synchronized(同步对象){
需要同步的代码块
}
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ synchronized(this){ // 要对当前对象进行同步 if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.println("卖票:ticket = " + ticket-- ); } } } } }; public class SyncDemo02{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; t2.start() ; t3.start() ; } };
也可以将方法同步
在需要同步的方法前加上synchronized关键字
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ this.sale() ; // 调用同步方法 } } public synchronized void sale(){ // 声明同步方法 if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.println("卖票:ticket = " + ticket-- ); } } }; public class SyncDemo03{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; t2.start() ; t3.start() ; } };
原文章地址:
http://blog.csdn.net/lijizhi19950123
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ synchronized(this){ // 要对当前对象进行同步 if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.println("卖票:ticket = " + ticket-- ); } } } } }; public class SyncDemo02{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; t2.start() ; t3.start() ; } };
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ this.sale() ; // 调用同步方法 } } public synchronized void sale(){ // 声明同步方法 if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.println("卖票:ticket = " + ticket-- ); } } }; public class SyncDemo03{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 定义线程对象 Thread t1 = new Thread(mt) ; // 定义Thread对象 Thread t2 = new Thread(mt) ; // 定义Thread对象 Thread t3 = new Thread(mt) ; // 定义Thread对象 t1.start() ; t2.start() ; t3.start() ; } };
阅读全文
0 0
- 关于java中的多线程
- 关于多线程中的安全问题
- Java中的多线程(一)关于线程的基本操作
- 关于Java中的多线程码下的一篇
- 关于JAVA的多线程
- 关于java多线程
- 关于JAVA多线程同步
- 关于JAVA多线程同步
- 关于JAVA多线程同步
- 关于JAVA多线程同步
- 关于JAVA多线程同步
- 关于Java的多线程
- 关于java的多线程
- 关于java多线程
- 关于JAVA多线程同步
- 关于Java多线程小结
- 关于JAVA多线程同步
- 【JAVA基础】关于多线程
- python md5加密方法
- 作业
- ubuntu各种安装包下载地址
- java b2b b2c o2o分布式电子商务云平台
- 通过docker-compose和ansible,进行自动发版
- 关于java中的多线程
- ACM—STL使用<map>
- 原码、反码、补码
- 作业
- 项目管理【一】
- Mysql 数据库开发规范
- okhttp下载图片
- kafka学习
- 作业