package ThreadDemo;
/**
* 1、怎么获取当前线程对象?
* 2、获取线程对象的名字
* 线程对象.getName();
* 3、修改线程对象的名字
* 线程对象.setName("线程名字");
* 4、当线程没有设置名字的时候,默认的名字有什么规律?
* Thread-0
* Thread-1
* Thread-2
*/
public class ThreadTest05 {
public static void main(String[] args) {
// 创建线程对象
MyThread2 t = new MyThread2();
// 设置线程的名字
// t.setName("tttt");
// 获取线程的名字
System.out.println(t.getName());
// 启动线程
t.start();
}
}
class MyThread2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("分支线程-->" + i);
}
}
}
二、获取当前线程对象
package ThreadDemo;
/**
* 1、怎么获取当前线程对象?
* 2、获取线程对象的名字
* 线程对象.getName();
* 3、修改线程对象的名字
* 线程对象.setName("线程名字");
* 4、当线程没有设置名字的时候,默认的名字有什么规律?
* Thread-0
* Thread-1
* Thread-2
*/
public class ThreadTest05 {
public static void main(String[] args) {
// currentThread就是当前线程对象
// 这个代码出现在main方法当中,所以当前线程就是主线程
Thread currentThread = Thread.currentThread();
System.out.println(currentThread.getName());
MyThread2 t = new MyThread2();
t.setName("t");
MyThread2 t2 = new MyThread2();
t2.setName("t2");
t.start();
t2.start();
}
}
class MyThread2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
// currentThread就是当前线程对象
Thread currentThread = Thread.currentThread();
System.out.println(currentThread.getName());
}
}
}
三、线程的sleep方法
package ThreadDemo;
public class ThreadTest06 {
public static void main(String[] args) {
// 让当前线程进入休眠,睡眠5秒
// 当前线程是主线程
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 5秒之后执行这里的代码
System.out.println("hello world!");
}
}
四、终止线程的睡眠
package ThreadDemo;
/**
* sleep睡眠太久了,如果希望半道上醒来,该怎么办
* 注意:这个不是中断线程的执行,是终止线程的睡眠
*/
public class ThreadTest08 {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable2());
t.setName("t");
t.start();
//希望5秒之后,t线程醒来
try {
Thread.sleep(1000 * 5);
} catch (Exception 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");
}
}
五、强行终止线程的执行
不合理的写法
package ThreadDemo;
public class ThreadTest09 {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable3());
t.setName("t");
t.start();
//模拟5秒
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 5秒之后强行终止t线程
t.stop(); // 已过时(不建议使用。因为这种方式容易丢失数据)
}
}
class MyRunnable3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
合理的写法
package ThreadDemo;
public class ThreadTest09 {
public static void main(String[] args) {
MyRunnable3 r = new MyRunnable3();
Thread t = new Thread(r);
t.setName("t");
t.start();
//模拟5秒
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 5秒之后强行终止t线程
r.run = false;
}
}
class MyRunnable3 implements Runnable {
boolean run = true;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (run) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
//结束
return;
}
}
}
}