多线程的基本实现

进程:程序的执行过程(动态性);

           持有资源(内存)和线程(载体); 

线程:是一份程序里面不同的执行路径。

          线程共享进程的资源

          同一个进程有多个线程

          线程是系统中最小的执行单位

线程与进程的区别:

  多进程:在操作系统中能同时运行多个任务

  多线程:在同一应用程序中有多个数据流同时执行

 

       线程的交互:互斥、合作

  当一个线程休眠后另一个才获得处理器;

通过继承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){
                //降低输出速度的空循环
            }
        }
    }
}

 

posted @ 2017-08-01 17:36  Lune-Qiu  阅读(138)  评论(0编辑  收藏  举报