为何要用Thread ?
一、什么是Thread ?
public class Factorial { public static void main(String[] args) { int n = 5; System.out.print(n + "! is "); int fact = 1; while (n > 1) { fact *= n--; } System.out.println(fact); } // 代码的运行步骤是右上至下 // Java的入口是Main方法 }
二、创建Thread
Thread() 分配新的 Thread 对象。
Thread(Runnable target) 分配新的 Thread 对象。
Thread(Runnable target, String name) 分配新的 Thread 对象。
Thread(String name) 分配新的 Thread 对象。 Thread(ThreadGroup group, Runnable target) 分配新的 Thread 对象。 Thread(ThreadGroup group, Runnable target, String name) 分配新的 Thread 对象。以便将 target 作为其执行对象。将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配新的 Thread 对象,以便将 target 作为其执行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。
Thread(ThreadGroup group, String name) 分配新的 Thread 对象。
三、Thread的生命周期
class ThreadClass extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("Helo World! " + i); } } } public class CreateThread { public void run() { for (int i = 0; i < 5; i++) { System.out.println("Helo World! " + i); } } public static void main(String[] args) { CreateThread ourClass = new CreateThread(); ourClass.run(); ThreadClass threadClass = new ThreadClass(); threadClass.start(); } }
但线程都是线性从前往后运行的。
假设该线程是使用独立的 Runnable 执行对象构造的。则调用该 Runnable 对象的 run 方法;否则,该方法不执行不论什么操作并返回。
Thread 的子类应该重写该方法。
已过时。强迫线程停止运行。
在指定的毫秒数内让当前正在运行的线程休眠(暂停运行),此操作受到系统计时器和调度程序精度和准确性的影响。
该线程不丢失不论什么监视器的所属权。
在指定的毫秒数加指定的纳秒数内让当前正在运行的线程休眠(暂停运行),此操作受到系统计时器和调度程序精度和准确性的影响。
该线程不丢失不论什么监视器的所属权。
等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。
四、两种停止Thread的方式
public class RandomCharacterGenerator extends Thread { private volatile boolean done = false; @Override public void run() { // ... while (!done) { // ... } // ... } public void setDone() { done = true; } }
class InterruptedThread extends Thread { @Override public void run() { if (!isInterrupted()) { // } } }
測试线程是否已经中断。线程的中断状态 不受该方法的影响。
线程中断被忽略。由于在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。
返回:
假设该线程已经中断,则返回 true;否则返回 false。
測试当前线程是否已经中断。线程的中断状态 由该方法清除。
换句话说,假设连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除了当中断状态之后。且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
线程中断被忽略,由于在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。
返回:
假设当前线程已经中断,则返回 true;否则返回 false。
五、Runnable Interface
public class OurClass { public static void main(String[] args) { RunnableClass ourRunnableClass = new RunnableClass(); Thread thread = new Thread(ourRunnableClass); thread.start(); } } class RunnableClass implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("Helo World! " + i); } } }
六、Thread与对象
返回对当前正在运行的线程对象的引用。
測试线程是否处于活动状态。
假设线程已经启动且尚未终止,则为活动状态。
改变线程名称,使之与參数 name 同样。
首先调用线程的 checkAccess 方法,且不带不论什么參数。这可能抛出 SecurityException。
public final String getName()
返回该线程的名称。
public Thread(String name)
分配新的 Thread 对象。这样的构造方法与 Thread(null, null, name) 具有同样的作用。
public Thread(ThreadGroup group, String name)
分配新的 Thread 对象。这样的构造方法与 Thread(group, null, name) 具有同样的作用。