thread.sleep(int) 让线程进入休眠状态。如果在synchronized代码块或方法中执行sleep(int),线程并不会放弃对象的锁。
object.wait() :让当前获得object对象锁的线程进入该对象的线程等待队列。也就是让线程解开这个对象的锁, 同时进入休眠状态。wait状态的线程可被object.notify()唤醒。
object.notify() :从object对象的线程等待队列中随机唤醒一个线程。被唤醒的线程从object.wait()的位置继续往下执行。
object.notifyAll() :从object对象的线程等待队列中唤醒所有线程。
生产者和消费者模式:
package com.xinxin.mytest; import java.util.ArrayList; import java.util.List; public class TestThread { public static void main(String[] args){ Pool pool = new Pool(); Producer p1 = new Producer(pool, "p1"); Producer p2 = new Producer(pool, "p2"); Consumer c1 = new Consumer(pool, "c1"); p1.start(); p2.start(); c1.start(); } } class Producer extends Thread{ Pool pool; String name; public Producer(Pool pool, String name){ this.pool=pool; this.name=name; } @Override public void run(){ try{ while(true){ int a = this.pool.add(); System.out.println(String.format("name= %s add=%d", name, a)); //Thread.sleep(500); } }catch(Exception e){ e.printStackTrace(); } } } class Consumer extends Thread{ Pool pool; String name; public Consumer(Pool pool, String name){ this.pool=pool; this.name=name; } @Override public void run(){ try{ while(true){ int a = this.pool.del(); System.out.println(String.format("name= %s del=%d", name, a)); Thread.sleep(100); } }catch(Exception e){ e.printStackTrace(); } } } class Pool{ int MaxSize=3; int index=0; List<Integer> list = new ArrayList<Integer>(); public synchronized int add() throws Exception{ while(list.size()>=MaxSize){ this.wait(); } list.add(++index); System.out.println("add size="+list.size()); this.notify(); return index; } public synchronized int del() throws Exception{ while(list.size()==0){ this.wait(); } int res = list.remove(0); System.out.println("del size="+list.size()); this.notify(); return res; } }
上面的代码有个bug:当MaxSize=1时,三个线程p1、p2、p3可能同时进入wait状态,永不被唤醒。解决的办法,将this.notify()改成this.notifyAll()或this.notify(1000)
Thread.yield(); 谦让的意思,暂时解开该线程的CPU占用权,由其他线程有更多机会使用CPU。此方法可解决线程快速切换过程中某个线程集中占用CPU的问题。
thread.setDaemon(true); 设置线程为守护线程,当其他非守护线程结束后,守护线程会自动结束。前提是守护线程要放在死循环中,否则守护线程会先结束。
thread.setPriority(int proority); 设置线程优先级 事实并不能保证线程运行的优先级,所以一般不使用。一般使用共享变量控制线程的运行。
synchronized 修饰方法或者代码块,方法或代码块中的代码只能被同步访问。修饰动态方法时以当前类对象this作为锁,修饰静态方法时以类修饰符class作为锁。
thread1.join() 等待线程thread1执行完后继续当前线程的执行。
package com.xinxin.mytest; public class TestJoin { public static void main(String[] args){ Player p1 =new Player("tom",3); Player p2 =new Player("peter",5); Player p3 =new Player("terry",9); p1.start(); p2.start(); p3.start(); try { p1.join(); p2.join(); p3.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("斗地主可以开始了!"); } } class Player extends Thread{ String name; int waitTime; Player(String name, int waitTime){ this.name=name; this.waitTime=waitTime; } @Override public void run(){ try{ System.out.println(this.name+" is comming!"); Thread.sleep(this.waitTime*1000); System.out.println(this.name+" is arrived!"); }catch(Exception e){ e.printStackTrace(); } } }
执行结果
tom is comming!
terry is comming!
peter is comming!
tom is arrived!
peter is arrived!
terry is arrived!
斗地主可以开始了!:
停止线程:
1. 使用共享变量作为循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即可。
2. thread.interrupt() 中断
结束线程的冻结状态,使线程回到运行状态。简单粗暴,很少使用。
3. thread.stop() 终止线程 已被弃用
相关推荐
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
### Java多线程--让主线程等待所有子线程执行完毕 #### 核心知识点解析 在Java多线程环境中,让主线程等待所有子线程执行完毕是一个常见的需求,尤其是在处理大量数据或进行高性能计算时。这不仅有助于正确测量...
Java 多线程是并发编程中的重要概念,它允许程序同时执行多个任务,提升系统效率。线程通信是多线程编程中一个关键的组成部分,它确保线程间能有效地协同工作,避免竞争条件和死锁等问题。在Java中,线程通信主要...
在Java编程中,多线程是并发处理任务的关键技术,特别是在服务器端开发和高并发场景下。本篇文章将深入探讨“最简单的线程安全问题”,并结合相关源码和工具来帮助理解。线程安全问题通常涉及到多个线程对共享资源的...
### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...
通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...
Java多线程中,线程的生命周期是编程中必须理解的重要概念。在JDK1.5之前,线程被划分为五个状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。在JDK1.5及之后,线程的...
了解这些状态对于掌握Java多线程编程至关重要。 新建状态是指线程对象创建之后,此时线程尚未开始运行。就绪状态表示线程已经准备好运行,但CPU尚未分配时间片给它。运行状态是指线程获得CPU时间片后开始执行的过程...
Java多线程编程是开发高并发应用的基础,其中Thread类是实现多线程的核心类。本文将详细解析Thread类的常用结构以及线程优先级。 一、Thread类的常用结构 1. 线程中的构造器 - `Thread()`:创建一个没有指定名称...
在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
在Java多线程编程中,线程安全问题是非常关键的概念,它涉及到多个线程访问共享资源时可能出现的数据不一致或异常情况。本题主要通过两个练习题来加深对线程安全的理解。 ### 练习题1:新年倒计时 #### 题目描述 ...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...
在Java多线程编程中,线程安全问题通常是指多个线程访问共享资源时可能出现的不一致或错误状态。为了确保并发执行的线程能够正确地处理这些共享资源,Java提供了多种同步机制,其中之一就是同步方法。同步方法通过在...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的...
本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...
### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
本节我们将深入探讨Java中的多线程概念,包括其重要性、创建方法以及相关机制。 一、多线程的重要性 1. 提高资源利用率:多线程可以充分利用CPU的空闲时间,避免了单线程中等待IO操作时的资源浪费。 2. 提升程序...