在线程当中经常会遇到各种的特殊的办法,虽然不可能每一个办法都可以记得住,但要对其中比较常见的办法进行理解和记忆
比如说获得当前线程对象,其名字或者对其改名可以
static Thread currentThread() | 获取当前线程对象 |
String getName() | 获取线程对象名字 |
void setName(String name) | 修改线程对象名字 |
通过这三个办法进行相关的操作,但大部分的办法操作相比于这三个看起来会简单一些
据个例子,在示范代码当中存在这样的代码
class MyThread2 extends Thread {
public void run(){
for(int i = 0; i < 100; i++){
Thread currentThread = Thread.currentThread();
System.out.println(currentThread.getName() + "-->" + i);
}
}
}
在这段代码中,注意其中的第七行出现的currentThread办法 这个代码的作用是实现了麦年对程序时输出其代码段现在正在被那个线程索调用的信息
可以使用这样的代码进行验证
public class ThreadTest04 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
}
}
得到其输出是main,可以确定是输出其相关的信息,输出线程的名字的原因是我在这里使用getName()方法,从而减少了里面会输出的信息
假如我把其中的getName()去除之后可以得到结果是
Thread[main,5,main]
那么回来说这个问题,也就很好理解这里面的所有的输出
之前说过对于线程中断使用sleep,当出现现场呢个睡眠需要终止的情况的则需要interrupt。这个应该也有提过一下
但在这还是大体的说一下其重要性。
、
public class ThreadTest08 {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable2());
t.setName("t");
t.start();
// 希望5秒之后,t线程醒来(5秒之后主线程手里的活儿干完了。)
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 终断t线程的睡眠(这种终断睡眠的方式依靠了java的异常处理机制。)
t.interrupt();
}
}
class MyRunnable2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "---> begin");
try {
// 睡眠1年
Thread.sleep(1000 * 60 * 60 * 24 * 365);
} catch (InterruptedException e) {
e.printStackTrace();
}
//1年之后才会执行这里
System.out.println(Thread.currentThread().getName() + "---> end");
}
这里还是借用一位大佬的代码,放心并不会将你的cpu占有太长时间,将代码放置一段时间就会暂停运行。接下来就可以好好看看这段代码,如果将MyRunnable2中关于sleep这一段及相关删除,那么会发现程序会在处理5秒之后结束。
public class ThreadTest04 {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable2());
t.setName("t");
t.start();
// 希望5秒之后,t线程醒来(5秒之后主线程手里的活儿干完了。)
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 终断t线程的睡眠(这种终断睡眠的方式依靠了java的异常处理机制。)
t.interrupt();
}
}
class MyRunnable2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "---> begin");
//1年之后才会执行这里
System.out.println(Thread.currentThread().getName() + "---> end");
}
}
但这里的sleep好像没有被终止掉,这里现在存在疑惑,如果谁有经验的话可以写在评论里面
这里还存在其他的几个小知识run方法在书写的时候会发现并不存在throws,这里涉及java的一个y原则,子类不可以抛出比父类更多的异常。
上次提到了终止线程,现在存在更简单的方法,即将在想要终止线程的位置对其标记更改成为false即可。如果需要一个特殊值的话,尽量将这一大段全部写在if判断当中