线程Thread的启动,暂停,停止
构造函数
共8个,Constructor and Description
Thread() Allocates a new Thread object.
Thread(Runnable target) Allocates a new Thread object.
Thread(Runnable target, String name) Allocates a new Thread object.
Thread(String name) Allocates a new Thread object.
Thread(ThreadGroup group, Runnable target) Allocates a new Thread object.
Thread(ThreadGroup group, Runnable target, String name) Allocates a new Thread object so that it has target as its run object, has the specified name as its name, and belongs to the thread group referred to by group.
Thread(ThreadGroup group, Runnable target, String name, long stackSize) Allocates a new Thread object so that it has target as its run object, has the specified name as its name, and belongs to the thread group referred to by group, and has the specified stack size.
Thread(ThreadGroup group, String name) Allocates a new Thread object.
线程在启动之后,名称不允许修改:
public final synchronized void setName(String name) {
checkAccess();
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
if (threadStatus != 0) {
setNativeName(name);
}
}
---------------------
线程的启动
方法一:创建一个自定义的线程类,继承自Thread,并且重写run()方法。在run()方法中,写线程要执行的任务。调用线程类对象的start()方法。
示例如下:
public class MyThread extends Thread{
@Override
public void run(){
super.run();
System.out.println("MyThread运行中");
}
}
运行类代码:
public class Run{
public static void main(String[] args){
MyThread myThread = new MyThread();
myThread.start();
System.out.println("运行结束!");
}
}
需要注意的是,线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。
方法二:创建一个实现Runnablde接口的类,在Thread的构造函数中传入这个类的实例对象。调用线程类对象的start()方法。
示例如下:
public class MyRunnable implements Runnable{
@Override
public void run(){
super.run();
System.out.println("MyRunnable运行中");
}
}
运行类代码:
public class Run{
public static void main(String[] args){
Runnable runnable = new MyRunnable();
Thread myThread = new Thread(runnable);
myThread.start();
System.out.println("运行结束!");
}
}
需要注意的是,Thread类也实现了Runnable接口,也就是说构造函数Thread(Runnable target)不光可以传入Runnbale接口的对象,还可以传入一个Thread类的对象,这样完全将一个Thread对象中的run()方法交由其他的线程进行调用。
线程的暂停
暂停线程意味着此线程还可以恢复运行。在java中,可以使用suspend()方法暂停线程,使用resume()方法恢复线程的执行。
suspend()方法和resume()方法的缺点:
1.公共的同步对象的独占,使得其他线程无法访问公共同步对象;
2.数据不同步
---------------------
线程的停止
在java中有3种方法可以终止正在运行的线程。
1.使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
2.使用stop方法强行终止线程,不推荐(废弃,结果不可预料)
暴力法
stop()方法
3.使用interrupt方法中断线程
interrupt()方法
判断线程是否是停止状态有两个方法,this.interrupted()和this.isInterrupted()
this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清除置为false的功能。
此方法是静态方法。
此方法可以测试当前线程的中断状态。当前线程指的是运行this.interrupted()方法的线程,而不是this的线程对象。例如在main线程先调用A线程对象的interrupt()方法停止A线程,此时执行A线程对象的interrupted()方法,返回的是false。原因是interrupted()测试的线程是运行this.interrupted()方法的线程,即当前main线程的停止状态,而不是A线程的停止状态。
如果需要停止main线程,可以在main线程内调用Thread.currentThread().interrupt()方法,然后在main线程内通过Thread.interrupted()判断main线程的停止状态。
this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志。
此方法是对象方法,非静态。
此方法测试this线程对象的中断状态。例如在main线程先调用A线程对象的interrupt()方法停止A线程,此时执行A线程对象的interrupted()方法,返回的是true。
如果需要停止main线程,可以在main线程内调用Thread.currentThread().interrupt()方法,然后在main线程内通过Thread.interrupted()判断main线程的停止状态。
return法
异常法
沉睡法