标签:
进程与线程
进程:程序(任务)的执行过程(动态的),持有资源(共享内存,共享文件)和线程
如在我们电脑上的QQ,如果只是放在那里,并不是进程,只有当你点击它运行后,才启动了一个进程。
线程:如QQ,可以文字聊天,同时首发文件,这就是2个线程。
线程是系统中最小的执行单元,同一个进程可以拥有多个线程,线程共享进程的资源。
线程的交互:互斥(竞争)与同步(合作)
如,在同一个班级中,每个同学都是一个线程,大家共享公共资源如桌椅,黑板,学习资料等。同学间可以交流,关系有互斥与同步。如当同学A与同学B同时向使用某个学习资料时,就产生了互斥,需要一个一个使用;当学校组织文艺汇演时,需要同学间互相合作,才能表演优秀的节目。
Java线程之初体验
以隋唐英雄演绎这个实战项目来进一步了解Java的多线程
/** * 军队线程 * 模拟作战双方的行为 * @author * */ public class ArmyRunnable implements Runnable { //volatile(可见性 JMM, happens-before原则)保证线程可以正确读取其他线程写入的值 volatile boolean keepRunning = true; @Override public void run() { // TODO Auto-generated method stub while(keepRunning) { //发动5连击 for(int i=0; i<5; i++) { System.out.println(Thread.currentThread().getName() + "进攻对方第[" + i + "]击"); //让出了CPU时间,下次该谁进攻还不一定呢! Thread.yield(); } } System.out.println(Thread.currentThread().getName() + "结束了战斗!"); } } public class KeyPersonThread extends Thread { public void run() { System.out.println(Thread.currentThread().getName() + "开始了战斗!"); for(int i=0; i<10; i++) { System.out.println(Thread.currentThread().getName() + "左突右杀,攻击隋军。。。"); } System.out.println(Thread.currentThread().getName() + "结束了战斗!"); } } /** * 隋唐演义的大戏舞台 * @author * */ public class Stage extends Thread { public void run() { System.out.println("欢迎观看隋唐演义"); try { Thread.sleep(5000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("大幕徐徐打开"); try { Thread.sleep(5000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("话说隋朝末年,隋军与农民起义军杀得昏天黑地..."); ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable(); ArmyRunnable armyTaskOfRevolt = new ArmyRunnable(); //使用Runnable接口启动线程 Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty, "隋军"); Thread armyOfRevolt = new Thread(armyTaskOfRevolt, "起义军"); //启动线程,让双方军队开始作战 armyOfSuiDynasty.start(); armyOfRevolt.start(); //舞台线程休眠,大家专心观看军队的厮杀 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("正当双方激战正酣,半路杀出了个程咬金"); Thread mrCheng = new KeyPersonThread(); mrCheng.setName("程咬金"); System.out.println("程咬金的理想就是结束战争,使百姓可以安居乐业!"); //军队停止作战,停止线程的方法 armyTaskOfSuiDynasty.keepRunning = false; armyTaskOfRevolt.keepRunning = false; try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //历史大戏留给关键人物 mrCheng.start(); try { mrCheng.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("战争结束,人民安居乐业,程先生实现了积极的人生梦想,为人民作出了贡献"); System.out.println("谢谢观看隋唐演义,谢谢!"); } public static void main(String[] args) { // TODO Auto-generated method stub new Stage().start(); } }
Java线程交互
要点回顾
扩展
标签:
原文地址:http://www.cnblogs.com/little-YTMM/p/5404126.html