JAVA练手--线程(Thread)

1. 查看线程是否还存活

package tet;public class kk extends Thread{
    //1. 查看线程是否还存活
    public void run(){
        for(int i=0;i<5;i++)
            PrintName(2);
    }
    
    public void PrintName(int i){
        System.out.println(i+": "+Thread.currentThread().getName());
    }
    
    public static void main(String[] args)  {
        //把main建立出来当做子线程
        kk mythread = new kk();
        mythread.setName("Thread");
        
        System.out.println("before:"+mythread.isAlive());
        mythread.start();
        System.out.println("after:"+mythread.isAlive());
        
        for(int i=0;i<5;i++)
            mythread.PrintName(1);
        
        System.out.println("after:"+mythread.isAlive());
    }    
}

 

结果:

before:false
after:true
1: main
1: main
1: main
2: Thread
2: Thread
2: Thread
2: Thread
2: Thread
1: main
1: main
after:false

 

2. 状态监测

notify是唤醒wait的,wait可以是自己运行,也可以是别的程序运行;

 

 

结果:

class MyThread extends Thread{
    
    boolean tmp_wait = false;  //是否等待
    
    MyThread(){
        System.out.println(getName()+" : construct");
    }
    public void run(){
        System.out.println(getName()+" : running");
        startWait();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
   //注意:必须要同步
   synchronized void startWait() {
          try {
                  while(!tmp_wait) {
                     System.out.println(getName()+" : waiting");
                     wait(); 
                  }
          }
          catch(InterruptedException exc) {
             System.out.println(getName()+"interrupted");
          }
       }
   //注意:一定要同步,不同步不会编译报错,运行会出错,可以试试
   synchronized void notice() {
             tmp_wait = true;
          notify();
       }

}

public class kk {
   public static void main(String args[]) {
       System.out.println("hello world");
       MyThread t = new MyThread();
       try{
           t.setName("thread1");
           showThreadStatus(1, t);
           t.start();
           Thread.sleep(50);  
           showThreadStatus(2, t);
           
           t.notice();  //唤醒wait
           Thread.sleep(50);  
           showThreadStatus(3, t);
           
           if(t.isAlive()){
               showThreadStatus(4, t);
           }
           while(t.isAlive()){}
           
           showThreadStatus(5, t);

       }catch(InterruptedException e){
           e.printStackTrace();
       }
              
   }
   
   static void showThreadStatus(int num, Thread t){
       System.out.println("num="+num+" ;name="+t.getName()+" ; status="+t.getState()+" ; live="+t.isAlive());
   }

}

结果:

hello world
Thread-0 : construct
num=1 ;name=thread1 ; status=NEW ; live=false
thread1 : running
thread1 : waiting
num=2 ;name=thread1 ; status=WAITING ; live=true
num=3 ;name=thread1 ; status=TIMED_WAITING ; live=true
num=4 ;name=thread1 ; status=TIMED_WAITING ; live=true
num=5 ;name=thread1 ; status=TERMINATED ; live=false

 

3. 中断线程

package tet;


public class kk implements Runnable {
       public void run() {
              try {
                 System.out.println("in run() - 将运行 work2() 方法");
                 work2();
                 System.out.println("in run() - 从 work2() 方法回来");
              }
              catch (InterruptedException x) {
                 System.out.println("in run() - 中断 work2() 方法");
                 return;
              }
              System.out.println("in run() - 休眠后执行");
              System.out.println("in run() - 正常离开");
           }
           public void work2() throws InterruptedException {
              while (true) {
                 if (Thread.currentThread().isInterrupted()) {
                    System.out.println("C isInterrupted()=" + Thread.currentThread().isInterrupted());
                    Thread.sleep(2000);
                    System.out.println("D isInterrupted()=" + Thread.currentThread().isInterrupted());
                 }
              }
           }
           public void work() throws InterruptedException {
              while (true) {
                 for (int i = 0; i < 100000; i++) {
                    int j = i * 2;
                 }
                 System.out.println("A isInterrupted()=" + Thread.currentThread().isInterrupted());
                 if (Thread.interrupted()) {
                    System.out.println("B isInterrupted()=" + Thread.currentThread().isInterrupted());
                    throw new InterruptedException();
                 }
              }
           }
           public static void main(String[] args) {
               kk si = new kk();
              Thread t = new Thread(si);
              t.start();
              try {
                 Thread.sleep(2000);
              }
              catch (InterruptedException x) {
              }
              System.out.println("in main() - 中断其他线程");
              t.interrupt();
              System.out.println("in main() - 离开");
           }
        }

结果:

in run() - 将运行 work2() 方法
in main() - 中断其他线程
in main() - 离开
C isInterrupted()=true
in run() - 中断 work2() 方法

 

posted on 2018-03-28 09:19  maogefff  阅读(439)  评论(0编辑  收藏  举报

导航