JAVA線程控制


  可以通過線程的方法進行基本的線程控制,除了已知的start、run、sleep方法外還有isAlive、currentThread、interrupt方法。

isAlive:該方法用來測試線程是否處於活動狀態。線程由start方法啟動后,直至被終止之間的任何時刻都處於Alive狀態。當處於新建狀態和死亡狀態時,該方法返回false。

currentThread:該方法是Thread類的的類方法,返回正在使用CPU資源的線程。

interrupt:當線程處於休眠狀態時,一個占有CPU資源的線程可以讓休眠的線程調用interrupt方法喚醒自己,導致休眠的線程發生InterruptedException異常結束休眠,重新排隊等待CPU資源。

class A implements Runnable{
    Thread student,teacher;
    A(){
        teacher=new Thread(this,"王教授");
        student=new Thread(this,"張三");
    }
    
    public void run(){
        if(Thread.currentThread()==student){
            try{
                System.out.println(student.getName()+"正在睡覺,不聽課");
                Thread.sleep(1000*60*60);
            }catch(InterruptedException e){
                System.out.println(student.getName()+"被老師叫醒了");
            }
        }
        else if(Thread.currentThread()==teacher){
            for(int i=1;i<=3;i++){
                System.out.println("上課!");
            }try{
                Thread.sleep(500);
            }catch(InterruptedException e){}
            student.interrupt();
        }
    }
}

public class BasicControlThread{
    public static void main(String args[]){
        A a=new A();
        a.student.start();
        a.teacher.start();
    }
}

 

此外還有stop和join方法

stop():通過調用線程的實例方法stop()來終止線程,終止后即進入死亡狀態,不能再被調度。

join():一個線程在占有CPU資源期間,可以讓其他線程調用join()方法和本線程聯合。當前線程等待調用該方法線程結束后,再重新排隊等待CPU資源,以便恢復執行。

class TV{
    float price;
    String name;
    TV(String name,float price){
        this.price=price;
        this.name=name;
    }
}


class ThreadJoin implements Runnable{
    TV tv;
    Thread customer,tvMaker;
    ThreadJoin(){
        customer=new Thread(this,"顧客");
        tvMaker=new Thread(this,"電視制造商");
    }
    public void run(){
        if(Thread.currentThread()==customer){
            System.out.println(customer.getName()+"等"+tvMaker.getName()+"生產電視機");
            try{
                tvMaker.join();//線程customer開始等待tvMaker結束
            }catch(InterruptedException e){ }
            System.out.println(customer.getName()+"買了一台電視機"+tv.name+"價格:"+tv.price);    
        }
        else if(Thread.currentThread()==tvMaker){
            System.out.println(tvMaker.getName()+"開始生產電視機...");
            try{
                tvMaker.sleep(2000);
            }catch(InterruptedException e){ }
            tv=new TV("長虹牌",4500);
            System.out.println(tvMaker.getName()+"生產完畢!!!");
        }
    }
}

public class JoinThread{
    public static void main(String args[]){
        ThreadJoin th=new ThreadJoin();
        th.customer.start();
        th.tvMaker.start();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM