进程:程序的执行过程(动态性);
持有资源(内存)和线程(载体);
线程:是一份程序里面不同的执行路径。
线程共享进程的资源
同一个进程有多个线程
线程是系统中最小的执行单位
线程与进程的区别:
多进程:在操作系统中能同时运行多个任务
多线程:在同一应用程序中有多个数据流同时执行
线程的交互:互斥、合作
当一个线程休眠后另一个才获得处理器;
通过继承Thread类或Runnable接口,然后重写run方法实现多线程
能使用Runnable接口就不要使用Thread继承
补充:isAlive( ) //判断线程是否终止
getPriority( ) // 获得线程优先级数值
setPriority( ) //设置线程优先级
Thread.sleep() // 将当前线程睡眠指定毫秒数 静态方法
线程优先级用数字表示是从1到10,默认为5
public class TestThread1 { public static void main(String args[]) { Runner1 r = new Runner1(); r.start(); //r.run(); //Thread t = new Thread(r); //t.start(); for(int i=0; i<100; i++) { System.out.println("Main Thread:------" + i); } } } //class Runner1 implements Runnable { class Runner1 extends Thread { public void run() { for(int i=0; i<100; i++) { System.out.println("Runner1 :" + i); } } }
调用start方法是两个线程同步完成即交替运行;交替输出
调用run方法则是顺序执行;输出完一个才输出另一个
军队类:
import java.lang.invoke.VolatileCallSite; public class ArmyRunnable implements Runnable { volatile boolean running = true; public void run() { while(running){ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"第["+i+"]次攻击");//获得当前线程的引用 Thread.yield();//当前运行线程释放处理器资源 } } System.out.println(Thread.currentThread().getName()+"结束了战斗"); } }
关键人物类:
public class KeyPerson 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()+"结束了战斗!"); } }
舞台类:
public class Stage extends Thread{ public void run() { System.out.println("欢迎观看隋唐演义"); try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("大幕徐徐拉开"); try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("话说隋朝末年,隋军与农民军杀的天昏地暗"); ArmyRunnable SuiDynasty=new ArmyRunnable(); ArmyRunnable Fammer=new ArmyRunnable(); Thread ArmySuiDynasty=new Thread(SuiDynasty,"隋军"); Thread ArmyFammer=new Thread(Fammer,"农民起义军"); ArmySuiDynasty.start(); ArmyFammer.start(); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("正当双方激战正酣,半路杀出来个程咬金"); Thread MrCheng=new KeyPerson(); MrCheng.setName("程咬金"); System.out.println("程咬金的理想就是结束战争使百姓安居乐业"); SuiDynasty.running=false; Fammer.running=false; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } MrCheng.start(); try { MrCheng.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("程咬金实现了他的理想百姓安居乐业"); System.out.println("谢谢观看"); } public static void main(String[] args) { new Stage().run(); } }
线程停止的正确方法为设置旗标如上例中running
不正确的:
1.stop方法是不正常的停止方法不能使用,它会使程序戛然而止
2.interrupt方法不能正确的停止,它的初衷不是用于停止线程。
它不能与sleep(),join()一起使用 , 会产生错误:1.程序中断状态被清除 2.将收到InterruptedException
interrupted()和isInterrupted()方法返回的是boolean
例:
public class WrongWayThread extends Thread { public static void main(String[] args) { WrongWayThread thread=new WrongWayThread(); System.out.println("start thread..."); thread.start(); try { thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("interrupting thread"); thread.interrupt(); try { thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("stop application"); } public void run(){ while(!this.isInterrupted()){ System.out.println("thread is running"); long time=System.currentTimeMillis(); while(System.currentTimeMillis()-time<1000){ //降低输出速度的空循环 } } } }