
多线程
左绍骏
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多线程程序实现的方式3
多线程程序实现的方式3 提交的是Callable // 创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2); // 可以执行Runnable对象或者Callable对象代表的线程 Future<Integer> f1 = pool.submit(new MyCallable(100)); ...原创 2020-02-08 16:56:35 · 198 阅读 · 0 评论 -
线程池的概述和使用
线程池的概述和使用 A:线程池概述 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池。 ...原创 2020-02-08 16:37:37 · 184 阅读 · 0 评论 -
线程的五种状态
线程的五种状态原创 2020-02-08 15:21:47 · 173 阅读 · 0 评论 -
线程组的概述和使用
线程组的概述和使用 A:线程组概述 Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。 默认情况下,所有的线程都属于主线程组。 public final ThreadGroup getThreadGroup()//通过线程对象获取他所属于的组 public final String getName()//通过线程组对象获取他...原创 2020-02-08 15:19:59 · 250 阅读 · 0 评论 -
JDK1.5的新特性互斥锁
JDK1.5的新特性互斥锁 1.同步 使用ReentrantLock类的lock()和unlock()方法进行同步 2.通信 使用ReentrantLock类的newCondition()方法可以获取Condition对象。 需要等待的时候使用Condition的await()方法,唤醒的时候用signal()方法。 不同的线程使用不同的Condition,这样就能区分唤醒的时候找那个线...原创 2020-02-08 12:42:22 · 171 阅读 · 0 评论 -
线程间的通信注意的问题
线程间的通信注意的问题 1.在同步代码块中,用哪个对象锁就用哪个对象调用wait方法。 2.为什么wait方法和notify方法定义在Object这类中? 因为锁对象可以是任意对象,那么任意对象对应的类都是Object的子类,也就是Object是所有的类的基类,所以将方法定义在Object这个类中就会让任意对象对其进行调用。 3.sleep方法和wait方法的区别? a.sleep方法在同步函数...原创 2020-02-07 22:22:23 · 316 阅读 · 0 评论 -
三个或三个以上间的线程通信
三个或三个以上间的线程通信 多个线程通信的问题 notify()方法是随机唤醒一个线程 notifyAll()方法是唤醒所有线程 JDK5之前无法唤醒指定的一个线程 如果多个线程之间通信,需要使用notifyAll()通知所有线程,用while来反复判断条件 package com.heima.thread2; public class Demo02_NotifyAll { pub...原创 2020-02-07 22:18:43 · 338 阅读 · 0 评论 -
两个线程间的通信
两个线程间的通信 1.什么时候需要通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的。 如果我们希望他们有规律的执行,就可以使用通信,例如每个线程执行一次打印。 2.怎么通信 如果希望线程等待,就调用wait() 如果希望唤醒等待的线程,就调用notify() 这两个方法必须在同步代码中执行,并且使用同步锁对象来调用 package com.heima.thread2; ...原创 2020-02-07 21:46:29 · 1992 阅读 · 0 评论 -
Timer
Timer Timer类:计时器。一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 TimerTask:由Timer安排为一次执行或重复执行的任务。 package com.heima.thread; import java.util.Date; import java.util.Timer; import java.util.TimerTask; ...原创 2020-02-07 16:10:14 · 381 阅读 · 0 评论 -
Runtime类
Runtime类 Runtime类是一个单例类 Runtime r = Runtime.getRuntime(); //r.exec("shutdown -s -t 300"); //300秒后关机 r.exec("shutdown -a"); //取消关机 package com.heima.thread; import java.io.IOException; ...原创 2020-02-07 14:58:01 · 185 阅读 · 0 评论 -
单例设计模式
单例设计模式 单例设计模式:保证类在内存中只有一个对象。 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象。private (2)在本类中定义一个本类的对象。Singleton s; (3)提供公共的访问方式。 public static Singleton getInstance(){return s} 单例写法两种: (1)饿汉式 开发用...原创 2020-02-07 14:41:18 · 183 阅读 · 0 评论 -
以前的线程安全的类回顾
以前的线程安全的类回顾 A:回顾以前说过的线程安全问题 (线程是否安全查看是否使用synchronized关键字即可) 看源码:Vector,StringBuffer,Hashtable,Collections.synchroinzed(xxx) Vector是线程安全的,ArrayList是线程不安全的。 StringBuffer是线程安全的,StringBuilder是线程不安全的。 Ha...原创 2020-02-06 21:36:59 · 149 阅读 · 0 评论 -
死锁
死锁 多线程同步的时候,如果同步代码嵌套,使用相同锁,就有可能出现死锁。 为了避免同步代码块出现死锁的情况,同步代码块不要嵌套使用。 package com.heima.syn; public class Demo05_DeadLock { private static String s1 = "筷子左"; private static String s2 = "筷子右"; ...原创 2020-02-06 21:30:34 · 152 阅读 · 0 评论 -
火车站卖票的例子用实现Runnable接口
火车站卖票的例子用实现Runnable接口 package com.heima.syn; public class Demo4_Ticket { /** * @param args * 火车站卖票的例子用实现Runnable接口 */ public static void main(String[] args) { MyTicket mt = new MyTicket();...原创 2020-02-06 20:49:38 · 326 阅读 · 0 评论 -
线程安全问题
线程安全问题 多线程并发操作同一数据时,就有可能出现线程安全问题。 使用同步技术可以解决这种问题,把操作数据的代码进行同步,不要多个线程一起操作。 package com.heima.syn; public class Demo03_Ticket { /** * 需求:铁路售票,一共100张,通过四个窗口卖完. */ public static void main(String...原创 2020-02-06 16:25:37 · 145 阅读 · 0 评论 -
同步方法
同步方法 使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的。 非静态的同步方法的锁对象是神马? 答:非静态的同步方法的锁对象是this 静态的同步方法的锁对象是什么?为什么? 答:是该类的字节码对象。静态是优先于对象而存在的,静态方法中是不能定义this和super的,只有当你创建对象的时候this才有值。 class Printer { public s...原创 2020-02-06 12:22:44 · 263 阅读 · 0 评论 -
同步代码块
同步代码块 1.什么情况下需要同步 当多线程并发,有多段代码同时执行时,我们希望某一段代码执行的过程中CPU不要切换到其他线程工作,这时就需要同步。 如果两段代码是同步的,那么同一时间只能执行一段,在一段代码没执行结束之前,不会执行另外一段代码。 2.同步代码块 使用synchronized关键字加上一个锁对象来定义一段代码,这就叫同步代码块。 多个同步代码块如果使用相同的锁对象,那么他...原创 2020-02-06 10:49:40 · 2773 阅读 · 0 评论 -
设置线程的优先级
设置线程的优先级 setPriority()设置线程的优先级。 package com.heima.threadmethod; public class Demo07_Priority { public static void main(String[] args) { Thread t1 = new Thread(){ public void run() { for(...原创 2020-02-05 23:29:21 · 273 阅读 · 0 评论 -
礼让线程
礼让线程 yield让出cpu,让别的线程去执行。 (支持特别不好,很多时候看不出效果,只作为了解。) package com.heima.threadmethod; public class Demo06_Yield { public static void main(String[] args) { new MyThread().start(); new MyThread()....原创 2020-02-05 23:22:47 · 145 阅读 · 0 评论 -
加入线程
加入线程 join():当前线程暂停,等待指定的线程执行结束后,当前线程再继续。 join(int):可以等待指定的毫秒之后继续。 final Thread t1 = new Thread() { public void run() { for(int i = 0; i < 50; i++) { System.out.println(getName() +...原创 2020-02-05 21:44:29 · 207 阅读 · 0 评论 -
守护线程
守护线程 setDaemon():设置一个线程为守护线程,该线程不会单独执行,当其他非守护线程都执行结束后,自动退出。 Thread t1 = new Thread() { public void run() { for(int i = 0; i < 50; i++) { System.out.println(getName() + "...aaaaaaaaa...原创 2020-02-05 21:00:46 · 200 阅读 · 0 评论 -
休眠线程
休眠线程 Thread.sleep(毫秒,纳秒), 控制当前线程休眠若干毫秒1秒= 1000毫秒 1秒 = 1000 * 1000 * 1000纳秒 1000000000 package com.heima.threadmethod; public class Demo03_Sleep { /** * @param args * @throws InterruptedExcept...原创 2020-02-05 18:12:52 · 165 阅读 · 0 评论 -
获取当前线程的对象
获取当前线程的对象 Thread.currentThread():主线程也可以获取 package com.heima.threadmethod; public class Demo02_CurrentThread { public static void main(String[] args) { new Thread() { public void run() { ...原创 2020-02-05 17:59:53 · 508 阅读 · 0 评论 -
获取名字和设置名字
获取名字和设置名字 1.获取名字 通过getName()方法获取线程对象的名字 2.设置名字 通过构造函数可以传入String类型的名字 new Thread("xxx") { public void run() { for(int i = 0; i < 1000; i++) { System.out.println(this.getName() + ...原创 2020-02-05 16:33:09 · 419 阅读 · 0 评论 -
匿名内部类实现线程的两种方式
匿名内部类实现线程的两种方式 继承Thread类 new Thread() { //1,new 类(){}继承这个类 public void run() { //2,重写run方法 for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中 System.out.println("aaaaa...原创 2020-02-05 16:10:05 · 200 阅读 · 0 评论 -
继承Thread和实现Runnable的两种方式的区别
继承Thread和实现Runnable的两种方式的区别 查看源码的区别: a.继承Thread:由于子类重写了Thread类的run(),当调用start()时,直接找子类的run()方法。 b.实现Runnable:构造函数中传入了Runnable的引用,成员变量记住了它,start()调用run()方法时内部判断成员变量Runnable的引用是否为空,不为空编译时看的是Runnable的r...原创 2020-02-05 11:46:23 · 1123 阅读 · 0 评论 -
实现Runnable的原理
实现Runnable的原理 查看源码 1.看Thread类的构造函数,传递了Runnable接口的引用 。 2.通过init()方法找到传递的target给成员变量的target赋值。 3.查看run方法,发现run方法中有判断,如果target不为null就会调用Runnable接口子类对象的run方法。(父类对象指向子类,编译看左边,运行看右边。) ...原创 2020-02-05 11:34:43 · 722 阅读 · 0 评论 -
多线程程序实现的方式2
多线程程序实现的方式2 2:实现Runnable 定义类实现Runnable接口。 实现run方法。 把新线程要做的事写在run方法中。 创建自定义的Runnable的子类对象。 创建Thread对象,传入Runnable。 调用start()开启新线程,内部会自动调用Runnable的run()方法。 package com.heima.thread; public class De...原创 2020-02-04 23:02:32 · 116 阅读 · 0 评论 -
多线程程序实现的方式1
多线程程序实现的方式1 1:继承Thread 定义类继承Thread 重写run方法 把新线程要做的事写在run方法中 创建线程对象 开启新线程, 内部会自动执行run方法 package com.heima.thread; public class Demo02_Thread { public static void main(String[] args) { MyThrea...原创 2020-02-04 21:57:24 · 105 阅读 · 0 评论 -
Java程序运行原理和JVM的启动是多线程的吗
Java程序运行原理和JVM的启动是多线程的吗 A:Java程序运行原理 Java命令会启动java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。 B:JVM的启动是多线程的吗 JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。 package com.heima.thread...原创 2020-02-04 20:43:09 · 562 阅读 · 0 评论 -
多线程并行和并发的区别
多线程并行和并发的区别 并行:就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU) 并发:是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。 比如我跟两个网友聊天,左手操作一个电脑跟甲聊,同时右手用另一台电脑跟乙聊天,这就叫并行。 如果用一台电脑我先给甲发个消息,然后立刻再给乙发消息,然后再跟...原创 2020-02-04 17:30:44 · 931 阅读 · 0 评论 -
多线程的引入
多线程的引入 1.什么是线程 线程是程序执行的一条路径,一个进程中可以包含多条线程。 多线程并发执行可以提高程序的效率,可以同时完成多项工作。 2.多线程的应用场景 红蜘蛛同时共享屏幕给多个电脑。 迅雷开启多条线程一起下载。 QQ同时和多个人一起视频。 服务器同时处理多个客户端请求。 3.多线程的原理 表面上看是多个线程,底层还是在某段时间只执行一个线程,只不过CPU切换时间的特别...原创 2020-02-04 16:29:23 · 230 阅读 · 0 评论