
Java多线程
Java多线程学习
Orange#
这个作者很懒,什么都没留下…
展开
-
生产者与消费者模型
多线程中一般就两大类模型:一个是卖票模型,一个是生产者消费者模型。生产者生产数据,消费者取走数据就是消费者模型。具体来说是生产者生产数据,将数据放入一个公共信息存储点,然后消费者再从公共信息点取走数据。如下图:下面根据图示给出实例:class Message { // 公共信息类 private String title; private String info; pub...原创 2020-02-24 15:07:20 · 201 阅读 · 0 评论 -
死锁
死锁是在同步过多的时候发生的(同步是指多线程逐个执行同一内容,不同步是指多线程同时执行同一内容)。在实际中,大量的同步操作才可能导致死锁。如何理解死锁?比如一手交钱一手交货这个例子,甲跟乙说:你给我钱,我给你货;乙对甲说:你给我货,我给你钱。两者的执行前提互相限制,如果没有一方做出让步,那么两者就处于等待状态,出现了死锁。下面我们模拟这个例子写代码:class Money { publ...原创 2020-02-22 22:24:36 · 152 阅读 · 0 评论 -
线程同步处理
假如你在行驶的高铁上想上厕所,于是你走到厕所门前,发现提示灯提示里面有人,那么你只能等待。如果多个人想上厕所,那么就要排队。这个时候厕所只能在同一时刻给一个人使用。同样的道理,在多线程中处理同步问题时引入同步锁的概念,同步锁类似于厕所的门,它将单独的个体关在厕所里,其他人想进也进不去。同步锁的关键字是synchronized,实现同步锁有两种方式:同步代码块和同步方法。往往同步方法应用的比较多...原创 2020-02-22 20:45:01 · 144 阅读 · 0 评论 -
线程同步问题的引出
假设现在有一个卖票的情景,票数是固定的,正常情况下每当一个人买完n张票,票数就减少n张,然后直到票数为0为止。下面我们简单的模拟该情景:class TickectThread implements Runnable{ private int tickect = 5; @Override public void run() { for(int i = 0; i < 1...原创 2020-02-22 20:05:08 · 156 阅读 · 0 评论 -
线程优先级
许许多多的线程都有着它的优先级,理论上优先级越高越有可能执行,但不一定执行。Thread类中有定义如下处理优先级的方法:// 设置优先级public final void setPriority(int newPriority) {}// 获取优先级public final int getPriority() {}// 最低优先级,数值为1public final static...原创 2020-02-20 23:01:48 · 175 阅读 · 0 评论 -
线程礼让
线程礼让就是指在线程A和线程B执行的时候,线程B由于某种原因需要先一步执行,那么可以对线程A执行yield方法,先让线程B执行一步。注意:这里和join方法不一样,join方法是将CPU资源全都分出,直到线程B执行完,而yield只会让出一步。下面看一个例子:class MyThread9 extends Thread{ Thread main = null; public MyT...原创 2020-02-20 22:29:30 · 219 阅读 · 0 评论 -
线程强制执行
多个线程同时运行的时候我们可以指定一某个线程,让这个线程优先执行,也就是其他的线程让出CPU资源,直到指定的线程执行完毕,其他线程恢复正常工作。强制执行的方法就是join(),join()方法存在方法重载,这里说明一下:// 线程强制执行完毕public final synchronized void join(long millis) throws InterruptedExceptio...原创 2020-02-20 22:09:23 · 501 阅读 · 0 评论 -
线程中断
线程中断就是处于运行状态的线程被强制打断。线程中断总体来说有三种方法:正常退出、stop暴力停止、interrupt异常停止。其中使用stop()方法是不安全的,可能导致数据不同步或者资源无法回收,目前stop()方法已经被标注为作废方法。一般使用interrupt停止线程,这里有几个与之相关的方法:public void interrupt() {} // 中断线程public boo...原创 2020-02-20 21:14:36 · 2950 阅读 · 1 评论 -
线程休眠
顾名思义,线程休眠就是让线程进入睡眠状态,也是转为阻塞状态,这个时候的线程让出了CPU。线程休眠是sleep()方法,它怎么用呢?来看看源码:public static native void sleep(long millis) throws InterruptedException;public static void sleep(long millis, int nanos) th...原创 2020-02-20 18:24:53 · 806 阅读 · 1 评论 -
线程命名与获取
这里有几个与线程名有关的方法:public Thread(Runnable target, String name) // 接收Runnable以及线程的名字public final void setName(String name) // 设置和修改名字 对象名.setName();public final String getName() // 获取线程名字 对象名.getNam...原创 2020-02-19 21:17:10 · 313 阅读 · 0 评论 -
线程运行状态
线程是不太可能一直运行的,系统资源有限,多线程或多进程都必须在执行一段事件之后让出资源,交由其他线程继续执行。这是并发编程的本质。这里有五种运行状态:1、创建:定义好线程类对象,Thread实例2、就绪:调用start()方法的时候线程不是立即执行,而是进入到一个等待状态,等待CPU进行调度。3、执行:CPU执行调度到某个线程对象后,该线程对象开始执行run方法或call方法,但是...原创 2020-02-19 20:12:57 · 782 阅读 · 0 评论 -
Callable实现多线程
从Java提供多线程开始,最初的方案就是依靠Runnable接口定义线程类核心功能,但是Runnable中的run方法有一个缺点:该方法没有返回值。从JDK1.5开始,在JUC(java.util.concurrent)包中提供了一个新的多线程实现接口:@FunctionalInterfacepublic interface Callable<V>{ public V ...原创 2020-02-19 18:23:59 · 796 阅读 · 0 评论 -
Thread和Runnable的区别
我们稍后再谈区别,先来看这样一个问题:Thread接受Runnable接口对象和继承Thread类都可以使用start()方法启动线程,这两者的start()方法有什么区别呢?继承Thread类使用start()方法其实是调用start0()方法,然后 native关键字指引Java虚拟机使用操作系统做底层的函数调用,这样间接的触发的run()方法。Thread类接受Runnable对象,...原创 2020-02-19 13:14:01 · 1372 阅读 · 0 评论 -
Runnable实现多线程
直接查看Java API找到Runnable发现其定义:// 这是一个函数式接口@FunctionalInterfacepublic interface Runnable接口Runnable中包含抽象方法run(),我们知道Thread类实现了Runnable接口,进而也就必须要实现run()方法,通过创建Thread类的实例,使用start()方法来调动run()方法的执行,这是T...原创 2020-02-18 23:20:51 · 671 阅读 · 0 评论 -
继承Thread类
Java中的Thread类从JDK1.0开始就存在了,查阅Java API可以发现Thread类的定义:// Thread类继承了Object类,同时实现了Runnable接口。public class Threadextends Objectimplements Runnable同时可以发现Thread类有一个至关重要的run()方法,这个run()方法中包含着逻辑业务代码。创建...原创 2020-02-18 23:00:02 · 768 阅读 · 0 评论