package com.yiibai.tutorial.thread.hellothread; public class HelloMain { public static void main(String[] args) throws InterruptedException { int idx = 1; for (int i = 0; i < 2; i++) { System.out.println("Main thread running " + idx++); // Sleep 2101 miliseconds. Thread.sleep(2101); } HelloThread helloThread = new HelloThread(); // Run thread helloThread.start(); for (int i = 0; i < 3; i++) { System.out.println("Main thread running " + idx++); // Sleep 2101 miliseconds. Thread.sleep(2101); } System.out.println("==> Main thread stopped"); } }
package com.yiibai.tutorial.thread.hellothread; public class HelloThread extends Thread { // Code of method run() will be executed when // thread call start() @Override public void run() { int index = 1; for (int i = 0; i < 10; i++) { System.out.println(" - HelloThread running " + index++); try { // Sleep 1030 miliseconds. Thread.sleep(1030); } catch (InterruptedException e) { } } System.out.println(" - ==> HelloThread stopped"); } }
package com.yiibai.tutorial.thread.runnable; public class RunnableDemo implements Runnable { @Override public void run() { int idx = 1; for (int i = 0; i < 5; i++) { System.out.println("Hello from RunnableDemo " + idx++); // Sleep 2 second. try { Thread.sleep(2000); } catch (InterruptedException e) { } } } }
package com.yiibai.tutorial.thread.runnable; public class RunnableTest { public static void main(String[] args) throws InterruptedException { System.out.println("Main thread running.."); // Create a thread from Runnable. Thread thread = new Thread(new RunnableDemo()); thread.start(); // Sleep 5 seconds. Thread.sleep(5000); System.out.println("Main thread stopped"); } }
Thread thread = new MyThread(); // marks this thread as a daemon thread // This method is only called when the thread is not a start. // In the case of start, it will be throws an exception. thread.setDeamon(true); // marks this thread as a none-daemon thread // This method is only called when the thread is not a start. // In the case of start, it will be throws an exception. thread.setDeamon(false);
package com.yiibai.tutorial.thread.deamon; public class NoneDeamonThread extends Thread { @Override public void run() { int i = 0; // Loop 10 times. This thread will end. while (i < 10) { System.out.println(" - Hello from None Deamon Thread " + i++); try { // Sleep 1 second Thread.sleep(1000); } catch (InterruptedException e) { } } // None deamon thread ending. System.out.println("\n==> None Deamon Thread ending\n"); } }
package com.yiibai.tutorial.thread.deamon; class DeamonThread extends Thread { @Override public void run() { int count = 0; // Infinite loop while (true) { System.out.println("+ Hello from Deamon Thread " + count++); try { // Sleep 2 second sleep(2000); } catch (InterruptedException e) { } } } }
package com.yiibai.tutorial.thread.deamon; public class DaemonTest { public static void main(String[] args) { System.out.println("==> Main Thread running..\n"); // Create thread Thread deamonThread = new DeamonThread(); // Set deamon true deamonThread.setDaemon(true); deamonThread.start(); // Create other thread new NoneDeamonThread().start(); try { // Sleep 5 second Thread.sleep(5000); } catch (InterruptedException e) { } // Main Thread ending System.out.println("\n==> Main Thread ending\n"); } }
// Parent thread must wait until the end of this thread, before being continued. // (This is equivalent to calling join(0)) public final void join() throws InterruptedException; // Parent thread must wait 'millis' milliseconds to continue running. // After call join(long). // If the parameter millis = 0 means to wait until the end of this thread. public final synchronized void join(long millis) throws InterruptedException; // Parent thread must wait 'millis' milliseconds and 'nanos' nanoseconds to continue running. // After call join(long,int). // 1 second = 1000000 nanoseconds. public final synchronized void join(long millis, int nanos) throws InterruptedException;
package com.yiibai.tutorial.thread.join; public class JoinThread extends Thread { private String threadName; private int count; public JoinThread(String threadName, int count) { this.threadName = threadName; this.count = count; } @Override public void run() { for (int i = 1; i < count + 1; i++) { System.out.println("Hello from " + this.threadName + " " + i); try { Thread.sleep(2000); } catch (InterruptedException e) { } } System.out.println("\n==> Thread " + threadName + " end!\n"); } }
package com.yiibai.tutorial.thread.join; public class JoinTest { public static void main(String[] args) throws InterruptedException { System.out.println("\n==> Main thread starting..\n"); Thread joinThreadA = new JoinThread("A*", 2); Thread joinThreadB = new JoinThread("B*", 3); // None join Thread. Thread noJoinThreadC = new JoinThread("C", 5); joinThreadA.start(); joinThreadB.start(); noJoinThreadC.start(); // Using join() joinThreadA.join(); joinThreadB.join(); // The following code will have to wait until 2 // JoinThread A, B completed. System.out.println("Hello from main thread..."); System.out.println("Thread A isLive? " + joinThreadA.isAlive()); System.out.println("Thread B isLive? " + joinThreadB.isAlive()); System.out.println("Thread C isLive? " + noJoinThreadC.isAlive()); System.out.println("\n==> Main Thread end!\n"); } }
package com.yiibai.tutorial.thread.join; public class JoinTest2 { public static void main(String[] args) throws InterruptedException { System.out.println("\n==> Main thread starting..\n"); Thread joinThreadA = new JoinThread("A*", 5); joinThreadA.start(); // Main thread must wait to 5000 miliseconds, // and then continue running. (Not necessarily joinThreadA finish) joinThreadA.join(5000); System.out.println("Main thread after 5000 milli second"); System.out.println("Hello from main thread..."); System.out.println("Thread A isLive? " + joinThreadA.isAlive()); System.out.println("\n==> Main Thread end!\n"); } }
package com.yiibai.tutorial.thread.exception; import java.util.Random; public class ThreadExceptionDemo { public static class RunnableTest implements Runnable { @Override public void run() { System.out.println("Thread running .."); while (true) { Random r = new Random(); // A random number from 0-99 int i = r.nextInt(100); System.out.println("Next value " + i); try { Thread.sleep(2000); } catch (InterruptedException e) { } if (i > 70) { // Simulate an exception was not handled in the thread. throw new RuntimeException("Have a problem..."); } } } } public static void main(String[] args) { System.out.println("==> Main thread running..."); Thread thread = new Thread(new RunnableTest()); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("#Thread: " + t); System.out.println("#Thread exception message: " + e.getMessage()); } }); thread.start(); System.out.println("==> Main thread end..."); } }
从理论上讲,“yield”是指放手,放弃,投降。让步线程告诉虚拟机,它的愿意让其他线程在它的位置进行调度。则表示它没有太关键事情做了。 请注意,这只是一个暗示,不能保证有任何效果。
public static native void yield();