中断: 线程实例.interrupt();
lock锁的使用
package com.jlong;
 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
 
class User {
    public String name;
    public String sex;
 
    public boolean flag = false;
 
    public Lock lock = new ReentrantLock();
 
    public Condition conditionLock = lock.newCondition();
}
 
class InputThread extends Thread {
    private User user;
 
    public InputThread(User user) {
        this.user = user;
    }
 
    int cout = 0;
 
    @Override
    public void run() {
 
        while (true) {
//加锁
            user.lock.lock();
            if (user.flag) {
                try {
//线程等待
                    user.conditionLock.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            try {
                if (cout == 0) {
                    user.name = "jLong";
                    user.sex = "男";
                } else {
                    user.name = "燕子";
                    user.sex = "女";
                }
                cout = (cout + 1) % 2;
                user.flag = true;
//唤醒一个在 await()等待队列中的线程。与Object.notify()相似
                user.conditionLock.signal();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
//解锁
                user.lock.unlock();
            }
 
 
        }
    }
}
 
class OutputThread extends Thread {
 
 
    private User user;
 
    public OutputThread(User user) {
        this.user = user;
    }
 
    @Override
    public void run() {
        while (true) {
            user.lock.lock();
            if (!user.flag) {
                try {
                    user.conditionLock.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            try {
                System.out.println(user.name + "--" + user.sex);
                user.flag = false;
                user.conditionLock.signal();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                user.lock.unlock();
            }
 
 
        }
    }
}
 
public class ThreadDemo {
    public static void main(String[] args) {
        User user = new User();
        InputThread inputThread = new InputThread(user);
        OutputThread outputThread = new OutputThread(user);
        inputThread.start();
        outputThread.start();
    }
}
 
 

最新文章

  1. Python爬虫Scrapy框架入门(1)
  2. HBase的Write Ahead Log (WAL) —— API与基本概念
  3. Leetcode # 169, 229 Majority Element I and II
  4. 100款免费的圣诞节矢量图标素材(PSD & SVG)
  5. C#获取本机的MAC地址
  6. Spring 循环引用(singleton与prototype初始化的区别)
  7. Django admin进阶
  8. ASP.NET 日志
  9. 【HDOJ】2722 Here We Go(relians) Again
  10. 大话设计模式C++实现-文章7章-代理模式
  11. Android Studio 中提示 Private field 'mType' is assigned but never accessed 的原因
  12. java_web学习(九) PreparedStatement动态参数的引入
  13. lamp环境搭建经验总结
  14. 对小程序框架WePY的精简总结
  15. arcgis在折点处打断并建立网络分析(最短路径等问题)
  16. .net core实践系列之SSO-同域实现
  17. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(三十):使用flatMapGroupsWithState替换agg
  18. cnn 经典网络结构 解析
  19. mysql之 Percona XtraDB Cluster集群线程模型
  20. SQL记录-PLSQL条件控制

热门文章

  1. ASP.NET 一般处理程序 接收文件上传
  2. JAVA基础之ServletContext对象
  3. cscope安装
  4. 必须使用适当的属性或方法修改“ContentType”标头
  5. Python2 和 pip2 存在, Python3 也存在,但是 pip3 不存在的解决办法
  6. MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
  7. ansible之基础篇(三)
  8. [centos][yum] centos升级到特定版本
  9. 结构型模式(四) 组合模式(Composite)
  10. 如何获取一个Java对象所占内存大小