Java多线程详解
Java多线程详解
Zhang_Fangbo
这个作者很懒,什么都没留下…
展开
-
01-进程、线程、多线程
Process与Thread◆说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。◆而进程则是执行程序的一次执行过程,它是一个动态的概念。 是系统资源分配的单位◆通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的的单位。注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的原创 2021-12-02 00:22:28 · 35 阅读 · 0 评论 -
02-继承Thread类
创建线程方式一◆自定义线程类继承Thread类◆重写run()方法,编写线程执行体◆创建线程对象,调用start()方法启动线程package Demo01;//创建线程方式一:继承Thread类,重写run()方法 ,调用start 开启线程//总结:注意,线程开启不定立即执行,由CPU调度执行public class TestThread1 extends Thread{ @Override public void run() { //run方法线程体原创 2021-12-02 00:23:50 · 252 阅读 · 0 评论 -
03-多线程下载网图
网图下载案例package Demo01;import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;import java.net.URL;//案例:实现多线程同步下载3张图片public class TestThread2 extends Thread{ private String url;//网络图片地址 private String name;//保存原创 2021-12-02 00:24:19 · 194 阅读 · 0 评论 -
04-实现Runnable接口
创建线程方式二定义MyRunnable类实现Runnable接口实现run()方法,编写线程执行体创建线程对象,调用start()方法启动线程package Demo01;//创建线程方式2:实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类.调用start方法。public class TestThread3 implements Runnable{ @Override public void run() { //run方法原创 2021-12-02 00:24:54 · 112 阅读 · 0 评论 -
05-初识并发问题(抢火车票)
抢火车票案例package Demo01;//多个线程同时操作一个对象//买火车票的例子//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱。(可能出现多个人抢到同一张票)public class TestThread4 implements Runnable{ //票数 private int ticketNums = 10; @Override public void run() { while(true){原创 2021-12-02 00:59:34 · 87 阅读 · 0 评论 -
06-龟兔赛跑
龟兔赛跑package Demo01;//龟兔赛跑public class race implements Runnable{ private static String winner; @Override public void run() { for (int i = 1; i <= 100; i++) { //模拟兔子休息(每10步睡一觉) if(Thread.currentThread().get原创 2021-12-02 00:59:55 · 50 阅读 · 0 评论 -
07-实现Callable接口(了解即可)
创建线程方式三(了解即可)实现Callable接口1.实现Callable接口,需要返回值类型2.重写call方法, 需要抛出异常3.创建目标对象4.创建执行服务: ExecutorService ser =Executors.newFixedThreadPool(1);5.提交执行: Future result1 = ser.submit(t1);6.获取结果: boolean r1 = result1.get()7.关闭服务: ser.shutdownNow();package Dem原创 2021-12-02 01:00:29 · 84 阅读 · 0 评论 -
08-静态代理模式
静态代理模式//静态代理模式总结: //真实对象和代理对象都要实现同一个接口 //代理对象要代理真实角色//好处: //代理对象可以做很多真实对象做不了的事情 //真实对象专注做自己的事情public class StaticProxy { public static void main(String[] args) { WeddingCompany weddingCompany = new WeddingCompany(new Me());原创 2021-12-02 01:05:34 · 154 阅读 · 0 评论 -
09-Lambda表达式
Lambda表达式◆避免匿名内部类定义过多◆可以让你的代码看起来很简洁◆去掉了一堆没有意义的代码,只留下核心的逻辑。例1 Lambda表达式推导package Lambda;//Lambda表达式推导public class TestLambda1 { //3.静态内部类 static class Like2 implements ILike{ @Override public void lambda() { Syst原创 2021-12-02 01:05:53 · 155 阅读 · 0 评论 -
10-线程停止
线程停止不推荐使用JDK提供的stop()、destroy()方法。[已废弃]推荐线程自己停止下来。建议使用一个标志位进行终止变量,当flag=false,则终止线程运行。package state;//测试stop//1.建议线程正常停止--->利用次数,不建议死循环。//2.建议使用标志位--->设置一个标志位//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法public class TestStop implements Runnable{原创 2021-12-02 01:07:05 · 48 阅读 · 0 评论 -
11-线程休眠_sleep
线程休眠 sleeppackage state;import java.text.SimpleDateFormat;import java.util.Date;public class TestSleep { public static void main(String[] args) { //持续打印系统当前时间 Date startTime = new Date(System.currentTimeMillis());//获取系统当前时间原创 2021-12-04 21:50:26 · 55 阅读 · 0 评论 -
12-线程礼让_yield
线程礼让 yield礼让线程,让当前正在执行的线程暂停,但不阻塞将线程从运行状态转为就绪状态让cpu重新调度,礼让不一定成功!看CPU心情!package state;//测试礼让线程//礼让不一定成功public class TestYield { public static void main(String[] args) { MyYield myYield = new MyYield(); new Thread(myYield,"a").star原创 2021-12-04 21:51:02 · 178 阅读 · 0 评论 -
13-线程强制执行_join
线程强制执行 join◆join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞◆可以想象成插队package state;public class TestJoin implements Runnable{ @Override public void run() { for (int i = 0; i < 500; i++) { System.out.println("线程VIP来了"+i); }原创 2021-12-04 21:52:07 · 370 阅读 · 0 评论 -
14-观测线程状态
观测线程状态线程状态。 线程可以处于以下状态之一:NEW尚未启动的线程处于此状态。RUNNABLE在Java虚拟机中执行的线程处于此状态。BLOCKED被阻塞等待监视器锁定的线程处于此状态。WAITING正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。TERMINATED已退出的线程处于此状态。package state;public class TestState { publi原创 2021-12-04 21:56:38 · 78 阅读 · 0 评论 -
15-线程的优先级
线程的优先级package state;//测试线程的优先级public class TestPriority { public static void main(String[] args) { //主线程默认优先级 System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority()); MyPriority myP原创 2021-12-04 21:57:47 · 52 阅读 · 0 评论 -
16-守护线程
守护(daemon)线程◆线程分为用户线程和守护线程◆虚拟机必须确保用户线程执行完毕◆虚拟机不用等待守护线程执行完毕◆如,后台记录操作日志,监控内存,垃圾回收等待. . .package state;// 上帝守护你public class TestDaemon { public static void main(String[] args) { God god = new God(); You you = new You(); Thr原创 2021-12-04 21:58:15 · 555 阅读 · 0 评论 -
17-线程同步
线程同步由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加入锁机制 synchronized ,当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可。存在以下问题:◆一个线程持有锁会导致其他所有需要此锁的线程挂起;◆在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题;◆如果一个优先级高的线程等待一个优先级低的线程释放锁 会导致优先级倒置,引起性能问题.线程不安全案例1:买票原创 2021-12-04 21:59:01 · 448 阅读 · 0 评论 -
18-同步方法和同步块
同步方法和同步块由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,它包括两种用法:synchronized方法和synchronized块.同步方法: public synchronized void method(int args) {}synchronized方法控制对“对象”的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象的锁才能执行,否则线程会阻塞,方法一旦执原创 2021-12-05 22:43:19 · 284 阅读 · 0 评论 -
19-死锁
死锁多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题.产生死锁的四个必要条件:1.互斥条件: 一个资源每次只能被一个进程使用。2.请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。4.循环等待条件 :若干进程之间形成一种头尾相接的循环等待资源关系。//死锁:多原创 2021-12-20 17:33:08 · 57 阅读 · 0 评论 -
20-Lock锁
Lock锁◆从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当◆java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象◆ReentrantLock 类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是Reentra原创 2021-12-20 17:34:02 · 87 阅读 · 0 评论 -
21-线程协作(生产者消费者问题)
线程协作(生产者消费者问题)Java提供了几个方法解决线程之间的通信问题方法名作用wait()表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁wait(long timeout)指定等待的毫秒数notify()唤醒一个处于等待状态的线程notifyAll()唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度注意:均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常IllegalMonito原创 2021-12-20 17:36:25 · 271 阅读 · 0 评论 -
22-管程法与信号灯法
管程法与信号灯法管程法//测试:生产者消费者模型-->利用缓冲区解决:管程法//生产者,消费者,产品,缓冲区public class TestPC { public static void main(String[] args) { SynContainer container = new SynContainer(); new Producer(container).start(); new Consumer(container).原创 2021-12-20 17:36:57 · 112 阅读 · 0 评论 -
23-线程池
线程池import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;//测试线程池public class TestPool { public static void main(String[] args) { //1.创建服务,创建线程池 //newFixedThreadPool参数为:线程池大小 ExecutorService ser原创 2021-12-20 17:38:28 · 176 阅读 · 0 评论