慕课网 深入浅出java多线程
2015-11-29 11:08
309 查看
1.thread常用方法
java.langclass:Thread interface:runnable
创建线程:
thread()
thread(String name)
thread(Runnable target)
thread(Runnable target,String name)
方法:void start() ---------- 启动线程
static void sleep(long millis) ---------- 休眠
static void sleep(long millis,int nanos)
void join() ---------- 使其他线程等待当前线程终止
void join(long millis)
void join(long millis,int nanos)
static void yield( )
---------- 当前运行线程释放处理器资源
获取线程引用: static Thread currendThread()
如何正确停止线程
1.不要用stop方法2.使用退出标志
3.不要使用interrupt()方法,因为在线程run()中调用sleep(),join(),yeild()方法时,中断状态会被清除,isinterrupe=false
public class ActorThread extends Thread { public void run(){ System.out.println(getName()+"是一个演员!"); int count = 0; boolean keepRunning = true; while(keepRunning){ System.out.println(getName()+"登台演出:"+ (++count)); if(count == 100){ keepRunning = false; } if(count%10== 0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println(getName()+"的演出结束了!"); } public static void main(String[] args){ Thread actor = new ActorThread(); actor.setName("Mr. Thread"); actor.start(); Thread actressThread = new Thread(new Actress(),"Ms. Runnable"); actressThread.start(); } } class Actress implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+"是一个演员!"); int count = 0; boolean keepRunning = true; while(keepRunning){ System.out.println(Thread.currentThread().getName()+"登台演出:"+ (++count)); if(count == 100){ keepRunning = false; } if(count%10== 0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println(Thread.currentThread().getName()+"的演出结束了!"); } }
2.实例:隋唐演义( 英雄人物 隋军 .农民军 舞台)
1)KeyPerson Thread
public class KeyPerson extends Thread { public void run(){ System.out.println(Thread.currentThread().getName()+"开始战斗!!"); //发送10连击 for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"左图右击,攻击隋军"); } System.out.println(Thread.currentThread().getName()+"结束战斗!!"); } }
2) army Runnable
public class ArmyRunnable implements Runnable{ //volatile保证了线程可以正确的读取其他线程写值 volatile boolean keepRunning=true; public void run(){ System.out.println("开始战斗!!"); while(keepRunning){ //发送五连击 for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"发送攻击["+i+"]"); //让出了处理器时间,下次谁攻击谁还不定 Thread.yield(); } } System.out.println("结束战斗!!"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } }
3)Stage
public class Stage extends Thread { public void run(){ ArmyRunnable armyOfSui=new ArmyRunnable(); ArmyRunnable armyOfRev=new ArmyRunnable(); //使用runnable接口创建线程 Thread armyOfSuiDynasty=new Thread(armyOfSui,"隋军"); Thread armyOfRevolt=new Thread(armyOfRev,"农民军"); //启动线程,让军队开始作战 armyOfSuiDynasty.start(); armyOfRevolt.start(); //舞台线程休眠,大家专心观看军队厮杀 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("双方激战,杀出个程咬金!!"); Thread mrcheng=new KeyPerson(); mrcheng.setName("程咬金"); //停止军队作战 armyOfSui.keepRunning=false; armyOfRev.keepRunning=false; try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } //舞台大戏留给关键人物 mrcheng.start(); //所有线程等待程咬金完成 try { mrcheng.join(); } catch (InterruptedException e1) { e1.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Stage stage=new Stage(); stage.start(); } }
3.互斥同步
互斥: private final Object lockObj = new Object();synchronized(lockObj)
同步:lockObj.wait();
lockObj.notify();
lockObj.notifyAll();
wait set: 等待序列
public void transfer(int from, int to, double amount){
synchronized(lockObj){
// if (energyBoxes[from] < amount)
// return;
//while循环,保证条件不满足时任务都会被条件阻挡
//而不是继续竞争CPU资源
while (energyBoxes[from] < amount){
try {
//条件不满足, 将当前线程放入Wait Set
lockObj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(Thread.currentThread().getName());
energyBoxes[from] -= amount;
System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);
energyBoxes[to] += amount;
System.out.printf(" 能量总和:%10.2f%n", getTotalEnergies());
//唤醒所有在lockObj对象上等待的线程
lockObj.notifyAll();
}
}
相关文章推荐
- java线程死锁问题案列
- java性能优化总结
- 在eclipse中link安装Hibernate插件不成功的解决
- 黑马程序员—Java基础之—JDK新特性
- Spring MVC 核心处理流程
- Java 字符串处理
- Spring Boot:简化Spring应用初始搭建以及开发过程
- Eclipse在ubuntu下配置server的问题及解决方案
- HeadFirst_Java读书笔记
- BigInteger的使用总结
- spring源码(3)之解析配置文件的过程
- SpringMVC中避免拦截css,js,html图片等静态文件
- java 枚举
- 我看Java虚拟机(3)---类文件结构
- java基础随笔
- java修饰符
- java 俄罗斯方块02
- Java图形界面编程学习笔记(一)
- javaweb.用Jesery 构建rest服务
- Java 单例模式的常见应用场景