
多线程
菜汪在路上
这个作者很懒,什么都没留下…
展开
-
java的内存模型(概念)
在java中,设计之初就有了:主内存、线程工作内存,所以其实每一个线程执行时,都是将主线程copy一份到工作线程,执行修改后,再同步回去。x=b和a=1这两句话完全没有关联,编译器就有可能把他俩重新排顺序。(上面的代码只是理论,其实很难遇到)A线程取出时为10,正准备+10,数据变成了15,结果就成了15+10。4、使用内存时会:加锁,解锁。volatile可以让多个。但是使用了volatile就。,或者说不再操作工作内存。原创 2023-10-04 17:03:43 · 1493 阅读 · 0 评论 -
java的异步回调技术
【代码】java的异步回调技术。原创 2023-10-04 10:27:39 · 282 阅读 · 0 评论 -
线程池的应用
首先在源码中我们知道了,线程池的添加线程,就是添加worker类到map里。超时时间则是:非核心线程空闲下来了,一旦空闲时间达到了这么久,就回收它。在请求很多的时候,核心线程已经满了,并且阻塞队列也满了,就会开启(核心线程指的是在请求不多的时候,只有这么多线程是活的。)、谁调用就让它自己执行、尝试获取闲暇的线程池执行。这次调用如果:阻塞队列满了报错(最大线程指的是线程池的最大容量。使用最大cpu核心数量为最佳。原创 2023-10-03 10:37:37 · 181 阅读 · 0 评论 -
java阻塞队列
很好理解,没有多说的,直接上代码。原创 2023-10-02 15:32:40 · 91 阅读 · 0 评论 -
java读写锁
在多线程存取数据时,如果不加锁就会导致数据有误,线程安全问题。可是如果把写入、读取都加锁,写入还好,读取也变成一个一个的读取,就会比较慢。写入加锁,读取的时候可以多个读取,也就是独占锁(写)、共享锁(读)原创 2023-10-02 09:10:02 · 149 阅读 · 0 评论 -
多个线程启动 ,等待全部执行完毕再搜集数据
前几天在公司的项目上有个同事使用了多线程统计数据,当时出现了一个用户一直使用服务器首次登录信息作为查询信息。找了半天才发现,线程池资源同步了。后面手动将数据set进去的。等待线程全部执行完毕,这里使用的是减法计数器,也可而已用加法计数器:CyclicBarrier。原创 2023-10-01 16:34:17 · 766 阅读 · 1 评论 -
生产者、消费者问题
我的理解是cpu执行的数据很快,假如在某一刻A线程处于等待,B线程也处于等待,此时C线程唤醒了,这两个同时被唤醒,就出现了多次消费,虚假唤醒,其实就只能消费一次。然后就是使用java多线程包下的Condition ,它也可以阻塞、唤醒线程,它还有一个优势就是可以指定唤醒某一个线程。3、synchronized标识后,线程A执行,线程B会一直等待,lock可以中途释放。4、synchronized适合少量的数代码,lock用于大亮代码加锁。所以我们不能使用一次if作为判断,应该使用while作为判断,原创 2023-10-01 07:46:56 · 134 阅读 · 0 评论 -
java多线程的死锁、查找死锁代码、解决方案
死锁的产生原因是两个线程在互相等待对方,上代码: 产生的地方是: 将b线程锁住的同时,在里面又给了一个锁住a的锁,然而a在它自己的线程里面也被锁住了就造成了两个线程都被锁住了,解决方法就是将其中一个锁拿出锁外,变成这样: 这样这样b就能释放锁,然后a线程又能进行获得b的锁,继续释放锁。...原创 2022-07-12 09:17:48 · 339 阅读 · 0 评论 -
多线程的生命周期、让步方法、设置线程优先级
生命周期如图: 让步方法就是当本线程拿到CPU的执行权,执行让步方法是,让出本次CPU的执行权: 加了这个方法后,他们的输出有时候会是交替轮流输出一小会: 还有就是设置线程的优先级:优先级越高,获取到CPU的执行时间就越长、机会越大: 只有三个等级:1-5-10,默认等级是5...原创 2022-07-11 15:50:30 · 138 阅读 · 0 评论 -
多线程的守护线程和等待线程结束方法
守护线程的含义是:如果当前运行的所有线程都是守护线程,则程序直接结束 点击运行就直接结束了,当然有时候会输出几个,因为性能好的cpu速度很快,没等JVM反应过来,就已经输出了。等待线程结束方法:join()用途是本线程结束后,继续执行下一个线程: 输出的时候是完全有序的:(输出比较长,见谅) 大家可以去掉这个方法,多输出几次,就会发现,有的时候输出并不是有序的哦...原创 2022-07-11 14:54:06 · 301 阅读 · 0 评论 -
实现线程的暂停、继续、还有解决线程的安全问题
我在学习多线程的途中,想到了一个问题:有没有什么方法可以随时暂停、继续线程,于是我上网找了一下,可以如下代码实现 注意,解开的时候一定要用调用wait()的同一个对象,不能使用另一个Object的对象来调用; 不然会出现A、B线程一直等待唤醒、程序就一直停在这里不动了还要注意的一点是: 同步传入的对象A,在方法体里面只能只用A,若是使用别的会报:IllegalMonitorStateException异常所以synchronized 的对象同步使用必须是同一个哦。......原创 2022-07-11 11:35:42 · 466 阅读 · 0 评论 -
创建多线程的三种方法(前两种比较常用)
第一种就是继承Thread类,重写run方法, 第二种是实现Runnable 接口,实现run方法,然后利用Thread类的有参构造法,传入实现Runnable 接口的类,进行创建多线程 第三种比较复杂,不过它的run方法可以有返回值:1.创建一个类实现Callable接口,这里的泛型就是run返回的值2.创建FutureTask类对象,FutureTask类实现了RunnableFuture,而这个接口又继承了Runnable 接口,所以FutureTask类也可以创建多线程, 其实还...原创 2022-07-11 10:33:38 · 1132 阅读 · 0 评论 -
利用多线程写一个龟兔赛跑游戏
大致思路:1.利用swing创建窗口,开始按钮,复原按钮,乌龟图片、兔子图片2.点击开始进行游戏,再次点击暂停游戏,再次点击继续游戏,点击复原按钮回到起点2.获取到兔子和乌龟的x坐标,创建两个线程每次加0~5随机,每加完一次休眠0~500毫秒3.当有其中一个到达终点时,停止游戏,点击复原再点击开始可以再次开始创建窗口代码如下: 代码也很好理解,主要是开始按钮这里:继续游戏方法: 暂停游戏方法...原创 2022-07-10 21:38:30 · 2437 阅读 · 5 评论