1.NEW: 表示线程刚刚创建,还没有进行运用
2.RUNNABLE :运行状态,当调用start()方法时候,处于该状态,表示线程所需要的一切都准备好了。
3. BLOCKED:阻塞状态,是当线程遇到了锁,那么就会进入到这个状态。
4. WAITING:等待中,① 当前线程A执行了A.wait(),则会将当前线程转换为WAITING状态,当其他线程(比如线程B)执行B.notify()方法或B.notifyAll()方法后,则会将当前线程转换为RUNNABLE状态;② 当前线程A执行了其他线程(比如线程B)的B.join()方法,则当前线程会进入WAINTING状态,等到执行了join()方法的线程(比如线程B)执行结束,当前线程会进入RUNNABLE状态;③ 在当前线程(比如线程A)中,执行了LockSupport工具类的park()方法,则当前线程A会进入WATING状态,等到其他线程(比如线程B)执行了LockSupport工具类的B.unpark(A)方法,则当前线程A会重新进入RUNNABLE状态。
5. TIMED_WAITNG(超时等待): 该状态不会进行无期限的等待,当超过限定时间会自动变为RUNABLE状态,比如是调用带时间的wait,sleep方法
6. TERMINATED终止状态:线程结束,处于终止状态。
线程主要有三种创建方式:继承Thread类,实现Runnable接口,实现Callable接口
public class ThreadTest {
/**
* 继承Thread类
*/
public static class MyThread extends Thread
{ @Override
public void run() {
System.out.println("This is child thread");
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
public class RunnableTask implements Runnable {
public void run()
{ System.out.println("Runnable!");
}
public static void main(String[] args) {
RunnableTask task = new RunnableTask();
new Thread(task).start();
}
}
上面两种都是没有返回值的
public class CallerTask implements Callable<String> {
public String call() throws Exception
{ return "Hello,i am running!";
}
public static void main(String[] args) {
//创建异步任务
FutureTask<String> task=new FutureTask<String>(new CallerTask());
//启动线程
newThread(task).start(); try {
//等待执行完成,并获取返回结果
String result=task.get(); System.out.println(result);
} catch (InterruptedException e)
{ e.printStackTrace();
} catch (ExecutionException e)
{ e.printStackTrace();
}
}
}
为什么调用start()方法会执行run()方法,而不去直接调用run方法:这是因为jvm会执行start()方法,是先创建一个线程,由创建出来的新线程去执行thread的run()方法,这样才会起到多线程作用。如果我们直接调用run方法,那么还是运行在主线程中,相当于顺序执行,起不到多线程作用。
下一章我们在接着说同步和锁,并发等。
ps: 希望大家一起参与学习,一起进步,留下评论,一起讨论下啊