package Lesson2;
public class MyThread {
public static void main(String[] args) throws InterruptedException {
//匿名内部类,创建线程
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("双十一");
}
});
thread.start();
//不调用join时,创建线程时耗时较长,下面的main方法的代码会先执行,
//调用join,表示thread(线程的引用)会加入当前线程(javaMain主线程),
// 等待thread执行完毕再执行后边的代码
thread.join();//阻塞方法,阻塞main
//阻塞,体现一个阻塞的状态 sleep()也是阻塞状态
//子线程加入到当前线程(main线程),一直等待子线程执行完毕,在执行后边的
//下面代码常常先执行,因为创建线程部分很耗时
System.out.println("上课");
//虽说main线程和创立的线程是平级的,所以打印是无序的,
// 但是一般先打印上课,再打印双十一,因为线程要创建,还要调用其他函数,所以费时
// 因为双十一执行的时间较长(时间片调度,就绪到运行状态,)
//等价
/*
Runnable runnable=new Runnable() {
@Override
public void run() {
}
};
Thread thread =new Thread(runnable);
thread.start();
*/
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
}
}
package Lesson2;
//中断线程
//interrupted();线程是否被中断,默认没有中断
public class StopThread {
/**
* 是否被中断,默认false
*/
private static volatile boolean myInterrupted;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (!myInterrupted){
System.out.println("hello");
//匿名内部类不能抛出去异常,只能捕获,处理异常
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//main线程阻塞,先执行引用线程,
//阻塞的这5秒钟,上面代码并发的执行已经执行了,每一秒钟打印一个hello
Thread.sleep(5000);
myInterrupted=true;
//用标志位来达到终止线程
}
}