1、线程的5种状态
新建:
就绪:当调用线程对象的start()方法(t.start();),线程即进入就绪状态。等待CPU分配时间片。
运行:
堵塞:等待堵塞(线程执行wait()方法)、同步阻塞(锁被其他线程占用)、.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。
死亡:
2、线程优先级
Java 线程的优先级是一个整数,其取值范围是 1(Thread.MIN_PRIORITY)- 10(Thread.MAX_PRIORITY)。
默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
3、创建线程的3种方式
1)继承Thread,并重写run方法。
public class MyThread extends Thread {
//本质上也是实现了 Runnable 接口的一个实例
@Override
public void run(){
System.out.print("a thread!");
}
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
}
}
2) 继承Tunable,并重写run方法,通过thread实例执行
public class MyThread extends Thread {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread b = new Thread(myRunnable); //Thread(Runnable threadOb,String threadName);
b.start();
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.print("b thread!");
}
}
3. 继承Callable<V>, 结合FutureTask<V>
-
创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
-
创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
-
使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
-
调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。
注意:FutureTask中的get()、isDone()、cancel()方法
注意:ft.get()会一直阻塞调用线程
public class MyThread extends Thread{
public static void main(String[] args) throws ExecutionException, InterruptedException {
//FutureTask
FutureTask<Integer> ft = new FutureTask<>(new MyCallable());
Thread t3 = new Thread(ft);
t3.start();
System.out.println("c thread is start");
System.out.println("c thread ret " + ft.get()); //ft.get()会一直阻塞调用线程
System.out.println("main end");
}
}
//第3种 Callable<V>
class MyCallable implements Callable<Integer>{//V的类型与Call返回结果类型一致
@Override
public Integer call() throws Exception {
Thread.sleep(10*1000);
System.out.println("c thread!");
return 2;
}
}
4、Thread 方法
//线程对象方法
public void start(); //使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
public void run(); //线程执行体, Runnable 对象的 run 或自身run
public final void join(long millisec); //等待该线程终止的时间最长为 millis 毫秒。 注意!java没有detach方法,与C++不一样
public final void setName(String name); //设置线程名
public final void setPriority(int priority); //设置线程优先级
public final void setDaemon(boolean on); //设置守护线程
public void interrupt(); //中断线程
public final boolean isAlive(); //线程是否处于活动状态
//线程静态方法
public static void yield();//暂停当前正在执行的线程对象,并执行其他线程。
public static void sleep(long millisec);//线程休眠(暂停执行)
public static boolean holdsLock(Object x);//当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
public static Thread currentThread();//返回对当前正在执行的线程对象的引用。
public static void dumpStack();//将当前线程的堆栈跟踪打印至标准错误流