两个小程序大概的了解一下java的线程


一、java的notify与wait

package org.calonlan.soulpower;public class MyThreadTest implements Runnable {private String name;private Object prev;private Object self;public MyThreadTest(String name, Object prev, Object self) {super();this.name = name;this.prev = prev;this.self = self;}@Overridepublic void run() {int count = 10;while (count > 0) {synchronized (prev) {//请求获得上一个的锁synchronized (self) {//请求获得自己的锁System.out.println(name+"--"+count);count--;try {Thread.sleep(1);//这里测试sleep,sleep只会让当前线程让出cpu、内存等资源,但不会释放锁} catch (InterruptedException e) {e.printStackTrace();}self.notify();//通知等待sefl的锁的线程可以启动了,同时在synchronized (self)块执行完成后释放self锁,程序继续执行}try {prev.wait();//这里释放prev锁,并且程序进入阻塞状态。等在notify的时候重新启动程序执行} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) throws Exception {Object a = new Object();Object b = new Object();Object c = new Object();MyThreadTest ta = new MyThreadTest("A", c, a);MyThreadTest tb = new MyThreadTest("B", a, b);MyThreadTest tc = new MyThreadTest("C", b, c);new Thread(ta).start();Thread.sleep(10);//---------{new Thread(tb).start();//   | Thread.sleep(10);//---------{三个Thread.sleep()是让主线程中保证三个线程按顺序启动new Thread(tc).start();//   |Thread.sleep(10);//---------{}}



二、java的condition中的signal与await

package org.calonlan.soulpower;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class BoundedBufferTest {final Lock lock = new ReentrantLock();//定义一个锁final Condition notFull = lock.newCondition();//锁中的状态,用来标识notfullfinal Condition notEmpty = lock.newCondition();//锁中的状态,用来标识notemptyfinal Object[] items = new Object[100];//队列int putptr, takeptr, count;public void put(Object x) throws Exception {lock.lock();/*在lock与unlock之间的代码才能保证线程安全*/try {// condition需要在while中判断while (count == items.length)notFull.await();//队列满的了时候用notFull来阻塞程序/*接收到notFull的signal或者队列本来就不满执行下面的代码*/items[putptr] = x;if (++putptr == items.length)putptr = 0;++count;notEmpty.signal();} finally {/*在lock与unlock之间的代码才能保证线程安全*/lock.unlock();}}public Object take() throws Exception {lock.lock();/*在lock与unlock之间的代码才能保证线程安全*/try {while (count == 0)notEmpty.await();//使用notemty来阻塞线程(如果count==0的时候),这里一定要用while来做判断Object x = items[takeptr];if (++takeptr == items.length)takeptr = 0;--count;notFull.signal();return x;} finally {/*在lock与unlock之间的代码才能保证线程安全*/lock.unlock();}}static class Thread1 extends Thread {private BoundedBufferTest BoundedBufferTest;public Thread1(BoundedBufferTest boundedBufferTest) {super();BoundedBufferTest = boundedBufferTest;}@Overridepublic void run() {int count = 0;try {while (true) {System.out.println(count + "放入");BoundedBufferTest.put(count++);Thread.sleep(100);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}static class Thread2 extends Thread {private BoundedBufferTest BoundedBufferTest;public Thread2(BoundedBufferTest boundedBufferTest) {super();BoundedBufferTest = boundedBufferTest;}@Overridepublic void run() {try {while (true) {System.out.println(Thread.currentThread().getName()+ BoundedBufferTest.take());Thread.sleep(10000);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {BoundedBufferTest boundedBufferTest = new BoundedBufferTest();Thread2 thread2 = new Thread2(boundedBufferTest);Thread1 thread1 = new Thread1(boundedBufferTest);thread1.start();thread2.start();}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpContext HttpRuntime

问题引出 HttpContext.Current.Cache .VS. HttpRuntime.Cache HttpRuntime.Cache:获取当前应用程序的CacheHttpContext.Current.Cache:为当前HTTP请求获取Cache对象,跨线程可用,在APM模式或创建了子线程的场景中不能用HttpContext…

sudo apt-get常用命令

一、卸载 1. sudo apt-get autoclean 如果你的硬盘空间不大的话,可以定期运行这个程序,将已经删除了的软件包的.deb安装文件从硬盘中删除掉。如果你仍然需要硬盘空间的话,可以试试apt-get clean,这会把你已安装的软件包的安装包也…

Spring项目中使用webservice实现h5的websocket通信

一、在项目中建立一个webservice来做后台操作。 package org.calonlan.soulpower.websocket;import java.text.SimpleDateFormat; import java.util.Date;import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.we…

c++简单桶排序

c简单桶排序 题目一样&#xff0c;还是排序 桶排序是排序算法里比较快的 代码 注释 #include <bits/stdc.h> using namespace std; int main() {int b[100];//b[]的大小是你排的数字的最大值 1 int n;int k;memset(b,0,sizeof(b));//把b[]数组清零 cin >> n;for…

[连载型] Neutron 系列 (15): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的...

问题导读&#xff1a;1.Nova安全组是什么&#xff1f;2.Nova的是如何配置的?3.FWaas是什么&#xff1f;1. Nova 安全组1.1 配置 节点配置文件配置项说明controller/etc/nova/nova.confsecurity_group_api nova是的 nova secgroup* 命令使用的是 nova 安全组的 API/etc/neutro…

linux命令笔记

alias 查看或设置别名。 ualias 取消别名。 mkdir -p 创建目录及子目录。 vi/vim 编辑器。 seq -s 生成数字序列。 yum 解决linux下包管理工具rpm的安装软件依赖问题&#xff0c;例如&#xff1a;yum install lrzsz -y。 cp -apr 拷贝文件或目录。 tree -Ld打印目录结构…

LeetCode题解

题目是这样的&#xff1a;一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。问总共有多少条不同的路径&a…

Mysql的执行顺序与优化分析

编写顺序与执行顺序分析 一条完整的sql语句编写流程应该如下&#xff1a; select distinct 查询字段 from 表名 JOIN 表名 ON 连接条件 where 查询条件 group by 分组字段 having 分组后条件 order by 排序条件 limit 查询起始位置, 查询条数 但是在mysql实…

java获得指定的开始时间与结束时间之间的所有日期

import java.text.SimpleDateFormat; import java.util.Calendar;public class TimerTest {public static void main(String[] args) throws Exception {String beginDate "2016-07-16";//开始时间String endDate "2016-07-25";//结束时间SimpleDateForm…

linux中umask的使用

在linux创建文件、文件夹的时候会给它们赋予默认的权限&#xff0c;这个默认权限的赋予就是和umask相关的。总结如下&#xff1a; 1&#xff1a;x 执行 2&#xff1a;w 写入 4&#xff1a;r 读取 文件创建的时候的权限为 666与umask的每一位对应相减&#xff1b;如 umask 为…

jieba中文分词源码分析(四)

一、未登录词问题在jieba中文分词的第一节曾提到未登录词问题 中文分词的难点 分词规范&#xff0c;词的定义还不明确 (《统计自然语言处理》宗成庆)歧义切分问题&#xff0c;交集型切分问题&#xff0c;多义组合型切分歧义等 结婚的和尚未结婚的 > 结婚&#xff0f;的&…

hadoop2.4.2集群搭建及hive与mysql集成文档记录

1.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系######注意######如果你们公司是租用的服务器或是使用的云主机&#xff08;如华为用主机、阿里云主机等&#xff09;/etc/hosts里面要配置的是内网IP地址和主机名的映射关系4.关闭防火墙5.ssh免登陆6.安装JDK&#xff0c;配…

mybatis使用过程遇到的一些问题及解决方法

1.传入string单个参数进行判断是 要使用 <if test"_parameter ! null"></if> 2.mybatis批量插入 <insert id"insertSerily" parameterType"java.util.List"> insert into sys_role_resource (id, role_id, resource_id ) valu…

spring boot 与redis 整合

创建项目时需要导入的包 在application.yml 配置文件中配置需要的 spring:datasource:url: jdbc:mysql://localhost:3306/数据库名?useSSLfalse&serverTimezoneAsia/Shanghaiusername: 用户名password: 密码jpa:show-sql: truehibernate:ddl-auto: none #redis 可以不配,默…

Http长连接的例子_亲测可用哦

一、什么事Http长连接&#xff1a;在网上有很多很多关于Http长连接的文章&#xff0c;但是我看了很多都看不懂。自己总结的所谓的http长连接就是在一请求一个页面后&#xff0c;在服务器端不断开http连接&#xff0c;而是通过response一直在定时的往页面客户端刷新数据。 二、s…

不同操作系统上DNS客户端操作区别汇总

结论&#xff1a;windows有DNS缓存&#xff0c;Linux默认无DNS缓存&#xff0c;只能依赖于安装其他软件。 一、不同操作系统的客户端的DNS缓存差别 1、windows 系统中dns 解析器会使用系统的dns缓存来提高dns域名解析效率。 例如&#xff1a; 查看当前的dns cache内容&#xff…

SLAM学习心得——建图

1.建图 我们所谓的地图&#xff0c;即所有路标点的集合。一旦我们确定了路标点的位置&#xff0c;那就可以说我们完成了建图。 地图的作用&#xff1a;&#xff08;1&#xff09;定位 &#xff1b;&#xff08;2&#xff09;导航&#xff1b; &#xff08;3&#xff09;避障&am…

spark2

特点 通用 批处理 迭代式计算 交互查询 流处理 组件 spark core:任务调度 内存管理 容错机制 内部定义了RDDs 提供了很多API &#xff0c;为其他组件提供底层的服务 spark sql&#xff1a;报表统计 streaming :从kafka接收数据做实时统计 mlib&#xff1a;mll 支持横向扩展&am…

Oracle数据库----视图

--创建简单视图--建立用于查询员工号、姓名、工资的视图。create view emp_viewasselect empno,ename,sal from emp; --查询视图select * from emp_view; --创建视图时指定视图的列的别名create view emp_view2(员工号,姓名,工资)asselect empno,ename,sal from emp; --查询视图…

flume通过tcp/udp采集数据并存到kafka配置及操作方式

/*官方提供的kafka sink*/a1.sinks.k1.channel c1a1.sinks.k1.type org.apache.flume.sink.kafka.KafkaSinka1.sinks.k1.kafka.topic mytopica1.sinks.k1.kafka.bootstrap.servers localhost:9092a1.sinks.k1.kafka.flumeBatchSize 20a1.sinks.k1.kafka.producer.acks 1a…