1.引言
在本片博客中主要记录一下Thread
提供的几种方法,利用该方法我们可以实现一些我们的需求。
currentThread()
方法:注意这是静态方法,用于获得当前线程对象interrupted()
方法:注意这是静态方法,用于判断当前线程是否中断sleep()
方法:注意这是静态方法,让当前线程对象处于休眠状态yield()
方法:注意这是静态方法, 暂停当前正在执行的线程对象,并执行其他线程。getName()
方法:非静态的,可以帮助我们调试线程isAlive()
方法:非静态的,测试线程是否处于活动状态。interrupt()
方法:非静态的,中断线程。
*isInterrupted()
方法:注意这是非静态的。
上面介绍了7中方法,其中有四种静态方法,有三种非晶态方法。静态方法是和当前线程绑定的,静态方法是和当前线程绑定的,静态方法是和当前线程绑定的,重要的话说三遍,非静态方法是和实例对象绑定的。
2.Java线程提供的方法
2.1 解释静态方法是和当前线程绑定
- 代码
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("多线程技术");
}
}
public class app {
public static void main(String[] args) throws InterruptedException {
//创建一个线程实例
Thread td=new MyThread();
//启动线程
td.start();
//让线程睡5秒
td.sleep(5000);
System.out.println("main主线程");
}
}
代码解释
我们本来的意愿:让我们自定义的线程睡5秒,但是上面的代码是错误的(大家可以去实验一下), 因为我们在main线程中调用的sleep()方法,因为sleep方法是静态的,是和当前线程绑定的。 所以执行此方法,并不是让,Mythread线程睡5秒,而是让main线程睡了5秒钟。
2.2 利用interrupt()
方法控制线程停止。
在开发的过程中,在一些需求会有这样的代码:
while(true)
{
//代码
}
这是一个死循环,如果该死循环放在了多线程当中,我们如何去控制改循环的停止呢?此时我们借助于interrupted()
实现线程的停止,需要注意的是,调用interrupt()
方法调用之后并不会直接停止线程。需要结合一些判断才能停止我们的线程。(注意这不是一个方法,一个用于判断线程是否中断,一个是用来中断线程)步骤可以总结为两步:
第一步:
主线程中调用interrupt()中止线程
第二步:
自定义线程通过interrupted()方法跳出死循环,可以通过break,也可以通过return,也可以通过抛异常
break:跳出循环,
return:跳出方法
剖异常:跳出方法
- 我们自定义的线程
public class MyThread extends Thread{
@Override
public void run() {
int i=0;
while(true){
//当调用interrupt()方法之后,this.isInterrupted()的返回值为true
if(this.isInterrupted()){
System.out.println("线程被停止了");
return;//这里也可以是break;或者可以throw new InterruptedException();
}
System.out.println(i++);
}
}
}
- main方法中的代码
public class app {
public static void main(String[] args) throws InterruptedException {
//创建一个线程实例
Thread td=new MyThread();
//启动线程
td.start();
Thread.sleep(2000);
td.interrupt();
System.out.println("我要停止线程");
}
}
- 运行结果
2.3 使用yield()
可以让线程释放资源
- 代码如下
public class MyThread extends Thread{
@Override
public void run() {
long begin=System.currentTimeMillis();
for(int i=0;i<1000000;i++)
{
Thread.yield();
}
long end=System.currentTimeMillis();
System.out.print(end-begin);
}
}
- main函数
public class app {
public static void main(String[] args) throws InterruptedException {
//创建一个线程实例
Thread td=new MyThread();
//启动线程
td.start();
}
}
*运行结果
- 假设将Thread.yield()方法注释掉,运行结果
代码解释
我们使用Thread.yield()方法可以使该线程释放CPU资源,此方法并不需要我们自己唤醒线程。是可以自动唤醒自己的。
2.4补充
1.使用Stop方法也可以停止线程(不推荐,已经过时了)
2.使用suspend和resume可以暂停线程,启动线程(不推荐,已经过时了,并且存在着线程安全的问题。以后在说这个问题)
3.总结
在本博客中主要记录了:
- 如何停止线程
- 如何沉睡线程