1.构造方法
认识一个类,我们首先都要从构造方法开始,Thread类主要的构造方法有五个,我们经常使用的就是第一个Thread(),第二个Thread(Runnable target)以及第四个Thread(Runnable target ,String name),下面我们分别使用前四个创建线程
public static void main(String[] args) {
//调用空参构造,创建线程对象
Thread t1 = new Thread();
//调用含有String name参数的构造,创建线程对象
Thread t2 = new Thread("线程一");
//调用参数类型Runnable类型参数的构造方法,创建线程对象
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程三");
}
});
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程四");
}
},"线程四");
}
2.普通方法
Thread方法的还有一些普通方法,这些方法可以获取线程的相关信息,例如线程ID,线程状态
下面就对上述方法进行一个使用,
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
},"线程一");
t1.start();
System.out.println(t1.getId());
System.out.println(t1.getName());
System.out.println(t1.getState());
System.out.println(t1.getPriority());
System.out.println(t1.isAlive());
System.out.println(t1.isDaemon());
System.out.println(t1.isInterrupted());
}
与之对应的输出结果为:
对于线程状态,getState方法捕捉的某一时刻的线程状态,下一次运行相同的代码,线程的状态也会随之改变。
3.run()方法
run方法会在Runnable接口和Thread类中都有,在实现Runnable接口时,需要重写run方法,
我们观察以下代码
这是run方法,我们可以捕捉到一个信息,run方法是没有返回值的,对于run方法的使用,我们要明确一点,run方法内部的代码是线程执行的任务,而run方法的责任就是准备任务执行所需的资源。
当start方法被调用时,才是真正的创建线程。
4.start()方法
start方法,使某一个线程启动,在操作系统底层中真正的创建一个线程,具体如何创建我们看不到源码,之后JVM会调用该线程的run方法执行任务。
start和run方法的区别
对于两者的区别,本质上两者是没有什么可比性的,一个创建线程,一个准备线程所需资源,并不能混为一谈
- start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。 - run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
5.sleep()和 interrupt()方法
sleep方法是一个静态方法,在使用时需要捕捉或者抛出InterruptedException异常。
他的功能就是让某一线程阻塞一段时间,放弃cpu资源,等待唤醒,常常和 interrupt()方法配合使用。
6.join方法
public final void join(long millisec)
等待该线程终止的时间最长为 millis 毫秒。谁调用join方法,就让调用此方法的线程进入阻塞状态,等待我执行完毕之后,再往下执行;其实,join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态。
总结
以上呢就是多线程在使用时经常使用到的一些方法,配合这些方法,能够让编程效率更高,但在使用时有一些小的细节请大家对相关方法认真学习。