JAVA线程初体验
线程的创建
线程的启动和停止
/** * 演员类 继承Thread类 * @author Administrator * */ public class Actor extends Thread { //每个线程都有一个run方法 我们可以在run方法中来完成我们想要线程完成的任务 public void run(){ System.out.println(getName()+"是一个演员"); int count=0; System.out.println(getName()+"登台演出"+(++count)); System.out.println(getName()+"演出结束"); } public static void main(String[] args){ Thread actor = new Actor();//创建一个线程 actor.setName("程咬金");//设置线程名称 actor.start();//启动线程 } }
package com.imooc; /** * 演员类 继承Thread类 * @author Administrator * */ public class Actor extends Thread { //每个线程都有一个run方法 我们可以在run方法中来完成我们想要线程完成的任务 public void run(){ System.out.println(getName()+"是一个演员"); int count=0; boolean keepRunning = true; //只要keepRunning不为false 那么线程将一直运行 while(keepRunning) { System.out.println(getName()+"登台演出"+(++count)); if(count == 100) { //当演出场次达到100次的时候 停止演出 keepRunning = false; } //每次出场演出的速度太快 我们可以让演员每演完10场的时候休息1秒 if(count%10 == 0){ try { System.out.println("太累了,休息1秒"); Thread.sleep(1000);//这里是以毫秒计算的1000等于1秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println(getName()+"演出结束"); } public static void main(String[] args){ Thread actor = new Actor();//创建一个线程 actor.setName("Mr.Thread");//设置线程名称 actor.start();//启动线程 //创建一个新的线程 在构造方法中可以传入线程的名称 Thread actree = new Thread(new Actree(),"Mr.Runnable"); actree.start(); } } class Actree implements Runnable { @Override public void run() { //Runnable中没有getName() 方法 我们可以使用 Thread的currentThread()方法获得当前的线程 System.out.println(Thread.currentThread().getName()+"是一个演员"); int count=0; boolean keepRunning = true; //只要keepRunning不为false 那么线程将一直运行 while(keepRunning) { // System.out.println(Thread.currentThread().getName()+"登台演出"+(++count)); if(count == 100) { //当演出场次达到100次的时候 停止演出 keepRunning = false; } //每次出场演出的速度太快 我们可以让演员每演完10场的时候休息1秒 if(count%10 == 0){ try { System.out.println("太累了,休息1秒"); Thread.sleep(1000);//这里是以毫秒计算的1000等于1秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println(Thread.currentThread().getName()+"演出结束"); } }
模拟两只军队在舞台上表演战斗
军队类
public class Army implements Runnable { //volatile 是java的关键字 可见性 使得keepRunning可以接受外部线程的赋值 volatile boolean keepRunning = true; @Override public void run() { while(keepRunning) { //让军队发起5连攻 for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"发起进攻【"+i+"】"); Thread.yield();//yield()方法可以让线程让出处理器时间 和其他的线程共同争夺处理器资源 } } System.out.println(Thread.currentThread().getName()+"战斗结束"); } }
舞台类
/** * 舞台类 也是一个线程 * @author Administrator * */ public class Stage extends Thread { public void run(){ Army armyTaskSuiJun = new Army(); Army armyTaskRevolt = new Army(); Thread armySuiJun = new Thread(armyTaskSuiJun,"隋军"); Thread armyRevolt = new Thread(armyTaskRevolt,"农民起义军"); armySuiJun.start(); armyRevolt.start(); //让舞台休眠50毫秒 可以让观众安静的观看演出 try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } armyTaskSuiJun.keepRunning = false; armyTaskRevolt.keepRunning = false; try { armyRevolt.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { new Stage().start(); } }
关键先生类
package com.imooc; /** * 关键先生 * @author Administrator * */ public class KeyPersonThread extends Thread { public void run(){ System.out.println(getName()+"出场"); for(int i=1;i<=10;i++){ System.out.println(getName()+"进攻隋军"+i+"次"); } } }
舞台类 加入了关键先生代码
package com.imooc; /** * 舞台类 也是一个线程 * @author Administrator * */ public class Stage extends Thread { public void run(){ System.out.println("请观看隋唐演义"); try { Thread.sleep(3000); } catch (InterruptedException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } System.out.println("大幕徐徐拉开......"); try { Thread.sleep(3000); } catch (InterruptedException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } Army armyTaskSuiJun = new Army(); Army armyTaskRevolt = new Army(); Thread armySuiJun = new Thread(armyTaskSuiJun,"隋军"); Thread armyRevolt = new Thread(armyTaskRevolt,"农民起义军"); armySuiJun.start(); armyRevolt.start(); //让舞台休眠50毫秒 可以让观众安静的观看演出 try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("正当双方激战甚酣,半路杀出个程咬金"); Thread mrCheng = new KeyPersonThread(); mrCheng.setName("程咬金 "); System.out.println("程咬金的理想就是结束战斗,使人民安居乐业"); //正确停止线程的方法 正确的停止线程的方法应该使用停止标志 armyTaskSuiJun.keepRunning = false; armyTaskRevolt.keepRunning = false; //stop是错误的 不应该出现我们的代码中 他会使得线程戛然而止 使得线程不能够正常的结束 甚至没有执行完循环 以及程序的清理工作 // armySuiJun.stop(); // armyRevolt.stop(); try { Thread.sleep(2000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } mrCheng.start(); //join方法使其他线程等待mrCheng执行完在继续执行 try { mrCheng.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("战争结束,人民安居乐业"); } public static void main(String[] args) { new Stage().start(); } }