停止线程
stop方法已经过时。
如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,也就是线程结束。(设置标记,让标记对外展示)
/*
*
stop方法已经过时。
如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,也就是线程结束。
* */
class StopThread implements Runnable
{
private boolean flag =true;
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag()
{
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true)
{
if(num++ == 60)
{
st.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}
特殊情况:
当线程处于了冻结状态(wait,sleep,join)。就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();
如果线程在调用 Object
类的 wait()
、wait(long)
或 wait(long, int)
方法,或者该类的 join()
、join(long)
、join(long, int)
、sleep(long)
或 sleep(long, int)
方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException
。
class StopThread implements Runnable
{
private boolean flag =true;
public synchronized void run()
{
while(flag)
{
try {
this.wait(); // 当线程1进来时,处于等待状态;当线程2进来时,也处于等待状态,这时程序就无法结束。
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+"---"+e);
flag = false; // 设置标记为false
}
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag()
{
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true)
{
if(num++ == 60)
{
t1.interrupt(); // 中断t1线程,让他恢复到运行状态
t2.interrupt(); // 中断t2线程
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println(Thread.currentThread().getName()+"---over");
}
}
守护线程(后台线程)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。(主线程结束,守护线程必然结束)。
class StopThread implements Runnable
{
private boolean flag =true;
public synchronized void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag()
{
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.setDaemon(true); // 设置守护线程(随着主线程的结束而结束),必须在线程开启前设置
t2.setDaemon(true); // 设置守护线程
t1.start();
t2.start();
int num = 0;
while(true)
{
if(num++ == 60)
{
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println(Thread.currentThread().getName()+"---over");
}
}
join(等待该线程终止。)
/*
join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。
join可以用来临时加入线程执行。
*/
class Demo implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
Demo demo = new Demo();
Thread t1 = new Thread(demo);
Thread t2 = new Thread(demo);
t1.start();
// t1.join(); // 等待t1线程执行完成 (主线执行到此处,释放自己的cpu执行权,处于等待状态,当t1执行完毕,主线程被唤醒继续执行)
t2.start();
// t1.join(); // t1,t2交替执行,等待t1,t2执行完成,唤醒主线程执行。
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"--------->"+i);
}
}
}
线程优先级及yield()
toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。 //最大优先级10
setPriority(num); 设置线程优先级
static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
yield() 暂停当前正在执行的线程对象,并执行其他线程。
/*
toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。 //最大优先级10
setPriority(num); 设置线程优先级
static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
yield() 暂停当前正在执行的线程对象,并执行其他线程。
*/
class Demo1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().toString()+"--->"+i);
// Thread[Thread-1,5,main]--->19
Thread.yield(); //会出现执行一下线程1,执行一下线程2,交替执行
}
}
}
public class ThreadPriority {
public static void main(String[] args) throws InterruptedException {
Demo1 demo = new Demo1();
Thread t1 = new Thread(demo);
Thread t2 = new Thread(demo);
t1.start();
t1.setPriority(Thread.MAX_PRIORITY); // t1.setPriority(10); 将t1的优先级设置为10
t2.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"--------->"+i);
}
}
}