1.线程的状态
1.1创建
1.2就绪
1.3运行
1.4阻塞
1.5死亡
2.常用函数
java.lang.Thread.Thread(Runnable target, String name)
创建新线程,并指定线程的名字。
java.lang.Thread.Thread(ThreadGroup group, Runnable target, String name)
创建新线程,并指定线程的名字和所属线程组。
void java.lang.Thread.start()
让线程置于就绪状态,等待操作系统调度。
问:它与run()有什么区别呢?
答:start()是异步的,会新起一个线程,在新的线程中调用run()方法。直接调用run()就是在当前线程中执行同步的方法。
Thread java.lang.Thread.currentThread()
返回当前线程。
String java.lang.Thread.getName()
返回线程名称。
boolean java.lang.Thread.isDaemon()
是否是一个后台线程。
void java.lang.Thread.yield()
告诉操作系统此时可以进行线程切换。使用此方法有助于暴露线程不安全问题导致的异常现象。
java.lang.Thread.sleep(long millis, int nanos)
当前线程睡眠(millis 毫秒+nanos纳秒)。此方法会被TimeUnit这个枚举类型调用,可见:void java.util.concurrent.TimeUnit.sleep(long timeout)。
void java.lang.Thread.join(long millis)
此函数是同步的,当线程结束或等待达到超时时间后返回。
3.线程中断
Thread 的stop()与destory()方法被废弃,直接调用会有异常,见下:
@Deprecated public void destroy() { throw new NoSuchMethodError(); }所以现在你不能暴力地中断一个线程,只能让线程自己来配合。
void java.lang.Thread.interrupt()
Thread类有一个布尔字段isInterrupted,用来标记自己是否被中断。调用此方法会置这个变量为true。如果此线程被join()、wait()、sleep()方法阻塞,那么调用interrupt()方法时会引起InterruptedException异常。
boolean java.lang.Thread.isInterrupted()
返回上面说的isInterrupted布尔变量。
3.1 例子
@Override public void run() { while(true){ //do something } } //above and below is a contrast. @Override public void run() { while(!Thread.currentThread().isInterrupted()){ //do something } }
4.线程相关接口
4.1 Runnable
@FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }
4.2 Callable
@FunctionalInterface public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; }
4.3 Future
java.util.concurrent.Future<E>
Future对象代表着一个异步操作的结果。调用此对象的isDone()方法来查询任务是否已完成,它是异步的。调用get()方法获取线程执行结果,它是同步的,在结果准备就绪前一直阻塞。
它的接口定义见下:
public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }