thread.sleep(int) 让线程进入休眠状态。如果在synchronized代码块或方法中执行sleep(int),线程并不会放弃对象的锁。
object.wait() :让当前获得object对象锁的线程进入该对象的线程等待队列。也就是让线程解开这个对象的锁, 同时进入休眠状态。wait状态的线程可被object.notify()唤醒。
object.notify() :从object对象的线程等待队列中随机唤醒一个线程。被唤醒的线程从object.wait()的位置继续往下执行。
object.notifyAll() :从object对象的线程等待队列中唤醒所有线程。
生产者和消费者模式:
package com.xinxin.mytest; import java.util.ArrayList; import java.util.List; public class TestThread { public static void main(String[] args){ Pool pool = new Pool(); Producer p1 = new Producer(pool, "p1"); Producer p2 = new Producer(pool, "p2"); Consumer c1 = new Consumer(pool, "c1"); p1.start(); p2.start(); c1.start(); } } class Producer extends Thread{ Pool pool; String name; public Producer(Pool pool, String name){ this.pool=pool; this.name=name; } @Override public void run(){ try{ while(true){ int a = this.pool.add(); System.out.println(String.format("name= %s add=%d", name, a)); //Thread.sleep(500); } }catch(Exception e){ e.printStackTrace(); } } } class Consumer extends Thread{ Pool pool; String name; public Consumer(Pool pool, String name){ this.pool=pool; this.name=name; } @Override public void run(){ try{ while(true){ int a = this.pool.del(); System.out.println(String.format("name= %s del=%d", name, a)); Thread.sleep(100); } }catch(Exception e){ e.printStackTrace(); } } } class Pool{ int MaxSize=3; int index=0; List<Integer> list = new ArrayList<Integer>(); public synchronized int add() throws Exception{ while(list.size()>=MaxSize){ this.wait(); } list.add(++index); System.out.println("add size="+list.size()); this.notify(); return index; } public synchronized int del() throws Exception{ while(list.size()==0){ this.wait(); } int res = list.remove(0); System.out.println("del size="+list.size()); this.notify(); return res; } }
上面的代码有个bug:当MaxSize=1时,三个线程p1、p2、p3可能同时进入wait状态,永不被唤醒。解决的办法,将this.notify()改成this.notifyAll()或this.notify(1000)
Thread.yield(); 谦让的意思,暂时解开该线程的CPU占用权,由其他线程有更多机会使用CPU。此方法可解决线程快速切换过程中某个线程集中占用CPU的问题。
thread.setDaemon(true); 设置线程为守护线程,当其他非守护线程结束后,守护线程会自动结束。前提是守护线程要放在死循环中,否则守护线程会先结束。
thread.setPriority(int proority); 设置线程优先级 事实并不能保证线程运行的优先级,所以一般不使用。一般使用共享变量控制线程的运行。
synchronized 修饰方法或者代码块,方法或代码块中的代码只能被同步访问。修饰动态方法时以当前类对象this作为锁,修饰静态方法时以类修饰符class作为锁。
thread1.join() 等待线程thread1执行完后继续当前线程的执行。
package com.xinxin.mytest; public class TestJoin { public static void main(String[] args){ Player p1 =new Player("tom",3); Player p2 =new Player("peter",5); Player p3 =new Player("terry",9); p1.start(); p2.start(); p3.start(); try { p1.join(); p2.join(); p3.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("斗地主可以开始了!"); } } class Player extends Thread{ String name; int waitTime; Player(String name, int waitTime){ this.name=name; this.waitTime=waitTime; } @Override public void run(){ try{ System.out.println(this.name+" is comming!"); Thread.sleep(this.waitTime*1000); System.out.println(this.name+" is arrived!"); }catch(Exception e){ e.printStackTrace(); } } }
执行结果
tom is comming!
terry is comming!
peter is comming!
tom is arrived!
peter is arrived!
terry is arrived!
斗地主可以开始了!:
停止线程:
1. 使用共享变量作为循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即可。
2. thread.interrupt() 中断
结束线程的冻结状态,使线程回到运行状态。简单粗暴,很少使用。
3. thread.stop() 终止线程 已被弃用
相关推荐
Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的...
Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-...
Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的调度-合并 22 Java线程:...
title: 3-1-案例-售票&线程状态- Java多线程基础- Java多线程案例categories: Java多线程基础售票案例线程状态售票的动作需要被
【IT十八掌徐培成】Java基础第09天-004.多线程-状态机变换.zip
Java 多线程介绍 线程的几种状态 1
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
本文主要讲java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的线程函数用法、概述等。首先让我们来了解下在操作系统中进程和线程的区别:
对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送促销邮件用的,欢迎提意见和建议。 运行DispatcherMain可以测试,库结构自己可以...
java 多线程和服务器的源码,用于web服务器的java多线程控制
对java的多线程进行了较为详细的描述,包括如何实现、线程的四周状态、线程的优先级、线程的同步、线程的阻塞等等
多线程线程状态转换图
初学者学习java多线程的必备良师啊!! 该文档内容简单易懂 条理清晰 !! 内容包含:线程的状态及状态之间的转换 线程的优先级 线程的几大常用方法! 申明: 本文出自 “熔 岩” 博客,本人从百度文库转载而来! 大家都...
Java多线程(二)、线程的生命周期和状态控制
本次实验了解线程与进程的概念、区别与联系,掌握了多线程的内涵与使用场景,掌握了线程的状态与生命周期,掌握了Java实现多线程的两种方式,理解了临界区、对象锁、互斥、同步等核心概念,理解了线程的互斥与同步,...
Java多线程,进程与线程概念 创建和启动Java线程 线程状态和线程控制 多线程的互斥与同步 线程的通讯 死锁的概念
本资源包“Java多线程与线程安全实践-基于Http协议的断点续传....通过这个实践项目,学生不仅能够加深对Java多线程和线程安全概念的理解,还能提升解决实际问题的能力,为未来的软件开发工作打下坚实的基础。重新回答||
本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多线程模拟猴子采花 使用同步方法模拟购票 使用多线程模拟购物订单生成 使用 ThreadLocal 类模拟银行取款 Java高级...