线程主要发挥作用的时候:当一个线程所执行的I/O被阻塞的时候,同一进程中的其他线程可以使用CPU来进行计算。这样,就提高了程序的执行效率。
状态:运行、就绪(等待被调用)、阻塞(等待I/O资源)
两种创建方法:
- 继承Thread类,并override其中的run()方法(当一个类没有继承其他类的时候,适合用这种方法)
- 实现Runnable接口,并实现run()方法(当一个类已经继承另外一个类的时候,适合用这种方法)
通过使用自定义的构造方法传递各种参数。
启动:获得Thread对象后调用start()方法。
方法一:继承Thread类
public class MyThread1 extends Thread {
public MyThread1(String name) {
super(name);
}
public void run() {
System.out.println(this.getName());
}
public static void main(String[] args) {
Thread t1 = new MyThread1("阿三");
t1.start();
}
}
方法二:实现Runnable接口
public class MyThread implements Runnable {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name);
}
public static void main(String[] args) {
Thread tt1 = new Thread(new MyThread("张三"));
tt1.start();
}
}
一般情况下,可以使用一个内部类来定义另外一个线程:
/**
* 启动子线程的方式(使用内部类定义另外一个线程)
* @author XuJijun
*
*/
public class MyThread {
public static void main(String[] args) {
(new MyThread()).new AnotherThread("张三").start();
}
/**
* 内部类,实现子线程
*
*/
private class AnotherThread extends Thread{
private String msg;
/*
* 加一个参数,用于接收主线程的信息
*/
public AnotherThread(String msg) {
super();
this.msg = msg;
}
@Override
public void run() {
System.out.println("Hello " + msg);
}
}
}
等待和唤醒机制:
使用Object.wait()和Object.notify(),必须在同步方法或同步块里调用
使用join()方法等待另外一个线程的终止,如:
a.join();
System.out.print("End"); //等待线程a结束后再打印出“End”
sleep()和wait()的区别:
- sleep():占用CPU资源,或被调度走变成就绪状态
- wait():不占用CPU资源,等待被notify()唤醒