JAVA中创建线程的方式有两种:
1.实现Runnable接口,使用Thread的参数为Runnable类的构造函数创建Thread对象
2.继承Thread类,覆盖run方法
线程的启动:
直接调用上述Thread或者Runnable的run()方法仅仅是普通的方法调用,并不会真正启动一个线程
只有调用start()方法才会创建并启动一个线程
实现Runnable接口方式:
public class Calculator implements Runnable {
//线程数量
private static final int THREAD_NUM = 10;
//每个线程在控制台输出0到9
@Override
public void run() {
for (int i = 0; i < THREAD_NUM; i++) {
System.out.println(Thread.currentThread().getName() + " i = " + i);
}
}
public static void main(String[] args) {
Calculator cal = new Calculator();
//启动10个线程
for (int i = 0; i < THREAD_NUM; i++) {
Thread t = new Thread(cal);
t.start();
}
}
}
继承Thread方式:
public class Calculator extends Thread {
//线程数量
private static final int THREAD_NUM = 10;
//每个线程在控制台输出0到9
@Override
public void run() {
for (int i = 0; i < THREAD_NUM; i++) {
System.out.println(Thread.currentThread().getName() + " i = " + i);
}
}
public static void main(String[] args) {
Calculator cal = new Calculator();
//启动10个线程
for (int i = 0; i < THREAD_NUM; i++) {
Thread t = new Calculator();
t.start();
}
}
}
线程的状态:
Thread类的属性包含了线程的所有信息
在Thread中定义的线程的状态有以下六种:1.NEW (新建状态)
刚创建的线程,还没启动(没有调用start()方法)
2.RUNNABLE(就绪状态)
调用了start()方法,但还需要等待一些操作系统的资源(例如CPU)
3.BLOCKED(阻塞状态)
3.1等待获得监视锁来进入synchronized block/mehod (同步代码块或者同步方法)
3.2在调用了wait()方法后,等待获得监视锁来重入synchronized block/mehod
4.WAITING(等待状态)
4.1调用了wait()方法,wait(long timeout)不会导致进入WAITING状态,因为过了时间之后就会继续执行
4.2调用了其他线程的join()方法,需要等待该线程执行完毕,同理join(long timeout)不会导致进入WAITING状态
4.3调用了LockSupport.part()
线程进入了WAITINIG状态是为了等待其他线程完成特定的操作:
1.调用了wait()之后等待notify()或者notifyAll()
2.调用了join()等待其他线程执行完毕
5.TIMED_WAITING(指定等待时间的等待状态)
5.1调用了wait(long timeout)
5.2调用了Thread.sleep(long timeout)
5.3调用了join(long timeout)
5.4调用了LockSupport.parkNanos
5.5调用了LockSupport.parkUntil
6.TERMINATED(结束状态)
线程执行完毕