Java/Threads/Thread Status

Материал из Java эксперт
Перейти к: навигация, поиск

Add a delay

   <source lang="java">


public class Main {

 public static void main(String[] args) {
   for (int i = 0; i < 10; i++) {
     System.out.println("i = " + i);
     try {
       Thread.sleep(1000);
     } catch (InterruptedException ie) {
       ie.printStackTrace();
     }
   }
 }

}

 </source>
   
  
 
  



Another way to stop a thread

   <source lang="java">

public class AlternateStop extends Object implements Runnable {

 private volatile boolean stopRequested;
 private Thread runThread;
 public void run() {
   runThread = Thread.currentThread();
   stopRequested = false;
   int count = 0;
   while (!stopRequested) {
     System.out.println("Running ... count=" + count);
     count++;
     try {
       Thread.sleep(300);
     } catch (InterruptedException x) {
        // re-assert interrupt
       Thread.currentThread().interrupt();
     }
   }
 }
 public void stopRequest() {
   stopRequested = true;
   if (runThread != null) {
     runThread.interrupt();
   }
 }
 public static void main(String[] args) {
   AlternateStop as = new AlternateStop();
   Thread t = new Thread(as);
   t.start();
   try {
     Thread.sleep(2000);
   } catch (InterruptedException x) {
   }
   as.stopRequest();
 }

}


 </source>
   
  
 
  



Another way to suspend and resume

   <source lang="java">

public class AlternateSuspendResume extends Object implements Runnable {

 private volatile int firstVal;
 private volatile int secondVal;
 private volatile boolean suspended;
 public boolean areValuesEqual() {
   return (firstVal == secondVal);
 }
 public void run() {
   try {
     suspended = false;
     firstVal = 0;
     secondVal = 0;
     workMethod();
   } catch (InterruptedException x) {
     System.out.println("interrupted in workMethod()");
   }
 }
 private void workMethod() throws InterruptedException {
   int val = 1;
   while (true) {
     // blocks if suspended is true
     waitWhileSuspended();
     stepOne(val);
     stepTwo(val);
     val++;
     // blocks if suspended is true
     waitWhileSuspended();
     Thread.sleep(200); // pause before looping again
   }
 }
 private void stepOne(int newVal) throws InterruptedException {
   firstVal = newVal;
   // simulate some other lengthy process
   Thread.sleep(300);
 }
 private void stepTwo(int newVal) {
   secondVal = newVal;
 }
 public void suspendRequest() {
   suspended = true;
 }
 public void resumeRequest() {
   suspended = false;
 }
 private void waitWhileSuspended() throws InterruptedException {
   while (suspended) {
     Thread.sleep(200);
   }
 }
 public static void main(String[] args) {
   AlternateSuspendResume asr = new AlternateSuspendResume();
   Thread t = new Thread(asr);
   t.start();
   try {
     Thread.sleep(1000);
   } catch (InterruptedException x) {
   }
   for (int i = 0; i < 10; i++) {
     asr.suspendRequest();
     try {
       Thread.sleep(350);
     } catch (InterruptedException x) {
     }
     System.out.println("dsr.areValuesEqual()=" + asr.areValuesEqual());
     asr.resumeRequest();
     try {
       Thread.sleep((long) (Math.random() * 2000.0));
     } catch (InterruptedException x) {
     }
   }
   System.exit(0);
 }

}


 </source>
   
  
 
  



Daemon Thread

   <source lang="java">

public class DaemonThread implements Runnable {

 public void run() {
   System.out.println("entering run()");
   try {
     System.out.println("in run(): currentThread() is"
         + Thread.currentThread());
     while (true) {
       try {
         Thread.sleep(500);
       } catch (InterruptedException x) {
       }
       System.out.println("in run(): woke up again");
     }
   } finally {
     System.out.println("leaving run()");
   }
 }
 public static void main(String[] args) {
   System.out.println("entering main()");
   Thread t = new Thread(new DaemonThread());
   t.setDaemon(true);
   t.start();
   try {
     Thread.sleep(3000);
   } catch (InterruptedException x) {
   }
   System.out.println("leaving main()");
 }

}


 </source>
   
  
 
  



Determining When a Thread Has Finished

   <source lang="java">

public class Main {

 public static void main(String[] argv) throws Exception {
   Thread thread = new MyThread();
   thread.start();
   if (thread.isAlive()) {
     System.out.println("Thread has not finished");
   } else {
     System.out.println("Finished");
   }
   long delayMillis = 5000; // 5 seconds
   thread.join(delayMillis);
   if (thread.isAlive()) {
     System.out.println("thread has not finished");
   } else {
     System.out.println("Finished");
   }
   thread.join();
 }

} class MyThread extends Thread {

 boolean stop = false;
 public void run() {
   while (true) {
     if (stop) {
       return;
     }
   }
 }

}

 </source>
   
  
 
  



Interrupt a thread.

   <source lang="java">

class MyThread implements Runnable {

 public void run() {
   System.out.println(Thread.currentThread().getName() + " starting.");
   try {
     Thread.sleep(30000);
     for (int i = 1; i < 10; i++) {
       if (Thread.interrupted()) {
         System.out.println("interrupted.");
         break;
       }
       System.out.print(".");
       for (long x = 0; x < 1000; x++)
         System.out.println("/");
     }
   } catch (Exception exc) {
     System.out.println(Thread.currentThread().getName() + " interrupted.");
   }
   System.out.println(Thread.currentThread().getName() + " exiting.");
 }

} public class Main {

 public static void main(String args[]) throws Exception {
   Thread thrd = new Thread(new MyThread(), "MyThread #1");
   Thread thrd2 = new Thread(new MyThread(), "MyThread #2");
   thrd.start();
   Thread.sleep(1000);
   thrd.interrupt();
   thrd2.start();
   Thread.sleep(4000);
   thrd2.interrupt();
 }

}

 </source>
   
  
 
  



Is thread alive

   <source lang="java">

public class TwoThreadAlive extends Thread {

 public void run() {
   for (int i = 0; i < 10; i++) {
     printMsg();
   }
 }
 public void printMsg() {
   Thread t = Thread.currentThread();
   String name = t.getName();
   System.out.println("name=" + name);
 }
 public static void main(String[] args) {
   TwoThreadAlive tt = new TwoThreadAlive();
   tt.setName("Thread");
   System.out.println("before start(), tt.isAlive()=" + tt.isAlive());
   tt.start();
   System.out.println("just after start(), tt.isAlive()=" + tt.isAlive());
   for (int i = 0; i < 10; i++) {
     tt.printMsg();
   }
   System.out.println("The end of main(), tt.isAlive()=" + tt.isAlive());
 }

}


 </source>
   
  
 
  



Monitor a thread"s status.

   <source lang="java">

class MyThread extends Thread{

 boolean waiting= true;
 boolean ready= false;
 MyThread() {
 }
 public void run() {
   String thrdName = Thread.currentThread().getName();
   System.out.println(thrdName + " starting.");
   while(waiting) 
     System.out.println("waiting:"+waiting); 
   System.out.println("waiting...");
   startWait(); 
   try {
     Thread.sleep(1000);
   } catch(Exception exc) {
     System.out.println(thrdName + " interrupted.");
   }
   System.out.println(thrdName + " terminating.");
 }
 synchronized void startWait() {
   try {
     while(!ready) wait();
   } catch(InterruptedException exc) {
     System.out.println("wait() interrupted");
   }
 }
 synchronized void notice() {
   ready = true;
   notify();
 }

} public class Main {

 public static void main(String args[]) throws Exception{
     MyThread thrd = new MyThread();
     thrd.setName("MyThread #1");
     showThreadStatus(thrd);
     thrd.start();
     Thread.sleep(50);
     showThreadStatus(thrd);
     thrd.waiting = false;
     Thread.sleep(50); 
     showThreadStatus(thrd);
     thrd.notice();
     Thread.sleep(50);
     showThreadStatus(thrd);
     while(thrd.isAlive()) 
       System.out.println("alive");
     showThreadStatus(thrd);
 }
 static void showThreadStatus(Thread thrd) {
   System.out.println(thrd.getName()+" Alive:"+thrd.isAlive()+" State:" + thrd.getState() );
 }

}

 </source>
   
  
 
  



Pause the execution

   <source lang="java">

class Wait {

 public static void oneSec() {
   try {
     Thread.currentThread().sleep(1000);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }
 public static void manySec(long s) {
   try {
     Thread.currentThread().sleep(s * 1000);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }

} public class Main{

 public static void main(String args[]) {
   Wait.oneSec();
   Wait.manySec(5);
 }

}

 </source>
   
  
 
  



Pause the execution of a thread using sleep()

   <source lang="java">

class Wait {

 public static void oneSec() {
   try {
     Thread.currentThread().sleep(1000);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }
 public static void manySec(long s) {
   try {
     Thread.currentThread().sleep(s * 1000);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }

} public class Main {

 public static void main(String args[]) {
   System.out.println("Wait one second");
   Wait.oneSec();
   System.out.println("Done\nWait five seconds");
   Wait.manySec(5);
   System.out.println("Done");
 }

}

 </source>
   
  
 
  



Pausing a Thread: set a variable that the thread checks occasionally, call Object.wait()

   <source lang="java">

public class Main {

 public static void main(String[] argv) throws Exception {
   MyThread thread = new MyThread();
   thread.start();
   while (true) {
     synchronized (thread) {
       thread.pause = true;
     }
     synchronized (thread) {
       thread.pause = false;
       thread.notify();
     }
   }
 }

} class MyThread extends Thread {

 boolean pause = false;
 public void run() {
   while (true) {
     synchronized (this) {
       while (pause) {
         try {
           wait();
         } catch (Exception e) {
         }
       }
     }
   }
 }

}

 </source>
   
  
 
  



Pausing the Current Thread: a thread can temporarily stop execution.

   <source lang="java">

public class Main {

 public static void main(String[] argv) throws Exception {
   long numMillisecondsToSleep = 5000; // 5 seconds
   Thread.sleep(numMillisecondsToSleep);
 }

}

 </source>
   
  
 
  



set Uncaught Exception Handler

   <source lang="java">

public class Uncaught implements Runnable {

 public static void main(String[] args) {
   Thread thread = new Thread(new Uncaught());
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
     public void uncaughtException(Thread t, Throwable e) {
       e.printStackTrace();
     }
   });
   thread.start();
 }
 public void run() {
   throw new ArithmeticException();
 }

}

 </source>
   
  
 
  



Stopping a Thread: set a variable that the thread checks occasionally

   <source lang="java">

public class Main {

 public static void main(String[] argv) throws Exception {
   MyThread thread = new MyThread();
   thread.start();
   thread.stop = true;
 }

} class MyThread extends Thread {

 boolean stop = false;
 public void run() {
   while (true) {
     if (stop) {
       return;
     }
   }
 }

}

 </source>
   
  
 
  



Thread sleep

   <source lang="java">

public class TwoThreadSleep extends Thread {

 public void run() {
   Thread t = Thread.currentThread();
   String name = t.getName();
   System.out.println("entered loop() - " + name);
   for (int i = 0; i < 10; i++) {
     try {
       Thread.sleep(200);
     } catch (InterruptedException x) {
       }
     System.out.println("name=" + name);
   }
   System.out.println("leave loop() - " + name);
 }
 public static void main(String[] args) {
   TwoThreadSleep tt = new TwoThreadSleep();
   tt.setName("thread");
   tt.start();
   // pause for a bit
   try {
     Thread.sleep(700);
   } catch (InterruptedException x) {
     // ignore
   }
 }

}


 </source>
   
  
 
  



Thread sleep and interrupt

   <source lang="java">

public class SleepInterrupt extends Object implements Runnable {

 public void run() {
   try {
     System.out.println("in run() - sleep for 20 seconds");
     Thread.sleep(20000);
     System.out.println("in run() - woke up");
   } catch (InterruptedException x) {
     System.out.println("in run() - interrupted while sleeping");
     return;
   }
   System.out.println("in run() - leaving normally");
 }
 public static void main(String[] args) {
   SleepInterrupt si = new SleepInterrupt();
   Thread t = new Thread(si);
   t.start();
   // Be sure that the new thread gets a chance to
   // run for a while.
   try {
     Thread.sleep(2000);
   } catch (InterruptedException x) {
   }
   System.out.println("in main() - interrupting other thread");
   t.interrupt();
   System.out.println("in main() - leaving");
 }

}


 </source>
   
  
 
  



Visual suspend and resume

   <source lang="java">

import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class SwingSuspendResume extends JPanel implements Runnable {

 private static final String[] symbolList = { "|", "/", "-", "\\", "|", "/",
     "-", "\\" };
 private Thread runThread;
 private JTextField symbolTF;
 public SwingSuspendResume() {
   symbolTF = new JTextField();
   symbolTF.setEditable(false);
   symbolTF.setFont(new Font("Monospaced", Font.BOLD, 26));
   symbolTF.setHorizontalAlignment(JTextField.CENTER);
   final JButton suspendB = new JButton("Suspend");
   final JButton resumeB = new JButton("Resume");
   suspendB.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       suspendNow();
     }
   });
   resumeB.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       resumeNow();
     }
   });
   JPanel innerStackP = new JPanel();
   innerStackP.setLayout(new GridLayout(0, 1, 3, 3));
   innerStackP.add(symbolTF);
   innerStackP.add(suspendB);
   innerStackP.add(resumeB);
   this.setLayout(new FlowLayout(FlowLayout.CENTER));
   this.add(innerStackP);
 }
 private void suspendNow() {
   if (runThread != null) { // avoid NullPointerException
     runThread.suspend();
   }
 }
 private void resumeNow() {
   if (runThread != null) { // avoid NullPointerException
     runThread.resume();
   }
 }
 public void run() {
   try {
     // Store this for the suspendNow() and
     // resumeNow() methods to use.
     runThread = Thread.currentThread();
     int count = 0;
     while (true) {
       // each time through, show the next symbol
       symbolTF.setText(symbolList[count % symbolList.length]);
       Thread.sleep(200);
       count++;
     }
   } catch (InterruptedException x) {
     // ignore
   } finally {
     // make sure that the reference to it is also lost.
     runThread = null;
   }
 }
 public static void main(String[] args) {
   SwingSuspendResume vsr = new SwingSuspendResume();
   Thread t = new Thread(vsr);
   t.start();
   JFrame f = new JFrame();
   f.setContentPane(vsr);
   f.setSize(320, 200);
   f.setVisible(true);
   f.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
       System.exit(0);
     }
   });
 }

}


 </source>