Java/Threads/Thread Status
Содержание
- 1 Add a delay
- 2 Another way to stop a thread
- 3 Another way to suspend and resume
- 4 Daemon Thread
- 5 Determining When a Thread Has Finished
- 6 Interrupt a thread.
- 7 Is thread alive
- 8 Monitor a thread"s status.
- 9 Pause the execution
- 10 Pause the execution of a thread using sleep()
- 11 Pausing a Thread: set a variable that the thread checks occasionally, call Object.wait()
- 12 Pausing the Current Thread: a thread can temporarily stop execution.
- 13 set Uncaught Exception Handler
- 14 Stopping a Thread: set a variable that the thread checks occasionally
- 15 Thread sleep
- 16 Thread sleep and interrupt
- 17 Visual suspend and resume
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>