zoukankan      html  css  js  c++  java
  • 暂停线程

    暂停线程意味着线程还可以恢复运行

    package resumeSuspend;
    
    /**
     * Created by liping.sang on 2017/1/13 0013.
     */
    public class MyThread extends  Thread{
        private long i=0;
    
        public void run(){
            while(true){
                i++;
            }
        }
        public long getI() {
            return i;
        }
    
        public void setI(long i) {
            this.i = i;
        }
    }
    package resumeSuspend;
    
    import interruptedAndIsInterrupted.*;
    
    /**
     * Created by Administrator on 2017/1/13 0013.
     */
    public class Run {
        public static  void main(String [] args){
            try {
              MyThread thread =  new MyThread();
                thread.start();
                Thread.sleep(5000);
                //A
                thread.suspend();
                System.out.println("A"+System.currentTimeMillis()+" i="+thread.getI());
                Thread.sleep(5000);
                System.out.println("A"+System.currentTimeMillis()+" i="+thread.getI());
                //B
                thread.resume();
                Thread.sleep(5000);
                //C
                thread.suspend();
                System.out.println("B"+System.currentTimeMillis()+" i="+thread.getI());
                Thread.sleep(5000);
                System.out.println("B"+System.currentTimeMillis()+" i="+thread.getI());
            }catch (Exception e){
    
            }
        }
    }
    A1484293047430 i=3313762423
    A1484293052430 i=3313762423
    B1484293057430 i=6671460667
    B1484293062430 i=6671460667

    从执行结果来看,线程的确被暂停了,而且还可以恢复成运行的状态。

    使用suspend和resume方法时,如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。

    suspend和resume方法的缺点---不同步

    使用suspend和resume方法时也容易出现因为线程的暂停二导致数据不同步的情况

    看如下例子:

    package suspend_resume_mosamevalue;
    
    /**
     * Created by liping.sang on 2017/1/13 0013.
     */
    public class MyObject {
        private String username = "1";
        private String password = "11";
    
        public  void setValue(String u,String p){
            this.username = u ;
            if(Thread.currentThread().getName().equals("a")){
                System.out.println("停止a线程");
                Thread.currentThread().suspend();
            }
            this.password = p;
        }
    public void printUsernamePassword(){
        System.out.println(username+" "+password);
    }
    
    }
    package suspend_resume_mosamevalue;
    
    /**
     * Created by liping.sang on 2017/1/13 0013.
     */
    public class Run {
        public static void main(String [] args) throws InterruptedException {
            final MyObject myobject = new MyObject();
            Thread thread1=new Thread(){
                public void run(){
                    myobject.setValue("a","aa");
                }
            };
            thread1.setName("a");
            thread1.start();
            Thread.sleep(500);
            Thread thread2 = new Thread(){
                public void run(){
                    myobject.printUsernamePassword();
                }
            };
            thread2.start();
        }
    }
    停止a线程
    a 11

    可以看出运行的结果出现了值不同步的情况。

  • 相关阅读:
    Layui数据表格的使用
    单选按钮和下拉框默认选中
    平方探测法处理散列函数冲突
    ssh框架整合笔记---配置文件
    第二十九个知识点:什么是UF-CMA数字签名的定义?
    第二十八个知识点:什么是公钥密码学的IND-CCA安全定义?
    第二十七个知识点:什么是对称密码加密的AEAD安全定义?
    第二十六个知识点:描述NAF标量乘法算法
    第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。
    第二十四个知识点:描述一个二进制m组的滑动窗口指数算法
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/6283090.html
Copyright © 2011-2022 走看看