suspend与resume使用

本文探讨了Java中线程的暂停与恢复机制,包括如何使用suspend和resume方法控制线程执行状态,揭示了这些方法可能导致的数据不一致及独占问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

暂停和恢复线程

suspend 用于暂停线程
resume 用于恢复线程

public class Test161 {
    public static void main(String[] args) {
    MyThread1 m = new MyThread1();
    Thread t = new Thread(m);
    t.start();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    t.suspend();
    System.out.println(System.currentTimeMillis()+" "+m.getI());
   //这里设睡眠是充分让线程获取cpu执行权    
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(System.currentTimeMillis()+" "+m.getI());

    t.resume();
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(System.currentTimeMillis()+" "+m.getI());




    }
}

class MyThread1 implements Runnable{
    private int i ;



    public int getI() {
        return i;
    }



    public void setI(int i) {
        this.i = i;
    }



    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true) {
            i++;
        }
    }

}

执行结果:

这里写图片描述

主要看恢复线程,是从线程暂停的位置开始启动的,恢复原来运行的状态。

独占问题
public class Test162 {
    public static void main(String[] args) {
        MyThread66 m = new MyThread66();
        Thread tt1 = new Thread(m);
        Thread tt2 = new Thread(m);
        tt1.setName("a");
        tt2.setName("b");
        tt1.start();
        tt2.start();


    }

     synchronized public void show() {
        if(Thread.currentThread().getName().equals("a")) {
            System.out.println("当前进来的线程暂停了");
            Thread.currentThread().suspend();

        }
    }
}

class MyThread66 implements Runnable{
    Test162 t = new Test162();
    @Override
    public void run() {
        // TODO Auto-generated method stub
        t.show();
    }

}

在有对象监视器的方法中,如果当前运行的线程如果暂定,其他线程是无法访问该方法,因为它没有释放锁。

数据不一致问题
package com.example.test;

public class Test163 {
    private String name ="xxx";
    private int age=21;
    public void setValue(String name,int age) {
        this.name = name;
        if(Thread.currentThread().getName().equals("a")) {
        Thread.currentThread().suspend();
        }
        this.age = age;

    }
    @Override
    public String toString() {
        System.out.println(name+"  "+age);
        return null;
    }

    public static void main(String[] args) {
        MyThread88 m8 =  new MyThread88();
        Thread t2  = new Thread(m8);
        Thread t3  = new Thread(m8);
        t2.setName("a");
        t2.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        t3.start();
    }
}

class MyThread88 implements Runnable {
    Test163 t = new Test163();

    @Override 
    public void run() {
        // TODO Auto-generated method stub
        if(Thread.currentThread().getName().equals("a")) {
            t.setValue("laoqqiang", 23);
        }else {
            t.toString();
        }
    }
}

我们通过两个新的线程来操作数据,中间暂停了,另外一个线程在打印数据,就出现不一致的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值