- 浏览: 265230 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (298)
- 工作感悟 (6)
- java基础 (23)
- 计算机硬件知识 (1)
- 计算机网络知识 (2)
- Struts (3)
- Srping (4)
- hibernate (0)
- ibatis (0)
- webservice (4)
- Thread (22)
- maven (5)
- ubuntu/linux/centos/redhat (46)
- SSO (1)
- ESB (0)
- 工作流 (0)
- oracle (15)
- 云计算 (1)
- hadoop (1)
- nosql (0)
- mysql (3)
- sqlserver (0)
- jquery (0)
- 分布式 (3)
- 集群 (0)
- 设计模式 (2)
- EJB (0)
- map (0)
- cache (5)
- Niginx+varnish+squid+Ats (14)
- Apache (0)
- 工作/职业规划 (0)
- Scala & Groovy (1)
- English (4)
- 数据结构/算法 (6)
- 开发工具 (5)
- 测试 (2)
- Exception (0)
- 定时器 (3)
- j2ee (2)
- 部署 (1)
- Openssl (1)
- 操作系统 (3)
- kvm (13)
- libvirt (5)
- PostgreSql (5)
- 虚拟化 (3)
- 概念理解 (1)
- virt-manager (1)
- RESTful (3)
- 其它 (4)
- ssh2 (14)
- windows (1)
- 房产 (2)
- svn (1)
- 手机 (1)
- ant (1)
- flume (2)
- sqoop (1)
- fastdfs (5)
- log4j (1)
- SPDY (1)
- mongodb (2)
- MQ (2)
- Mina (1)
- dubbo (4)
- PMP (1)
- Webshpere (2)
- jvm (1)
- Btrace (1)
- zookeeper (7)
- UML (1)
- spring cloud (6)
- spring boot (5)
- storm (0)
- 软件管理 (1)
- elasticsearch (1)
- 协议 (2)
- docker (1)
- 性能 (2)
- 安全 (1)
- 代码规范 (1)
- mqtt (1)
- lombok (1)
- 车联网 (1)
- kafka (1)
最新评论
1.sleep()
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常
比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。
2.join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。
3.yield()
它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
4.wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有
锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
注意 这三个方法都是java.lang.Ojbect的方法!
2.run()和start()
这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
3.关键字Synchronized
这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=0;i<10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)
{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
以上这段程序中的 i 变量并不是共享数据,也就是这里的Synchronized关键字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。
当把代码改成如下:Synchronized关键字才会起作用
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
JAVA线程的四种状态
线程有四种状态,任何一个线程肯定处于这四种状态中的一种:
1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。
2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。
3) 死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。
4) 停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常
比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。
2.join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。
3.yield()
它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
4.wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有
锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
注意 这三个方法都是java.lang.Ojbect的方法!
2.run()和start()
这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
3.关键字Synchronized
这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=0;i<10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)
{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
以上这段程序中的 i 变量并不是共享数据,也就是这里的Synchronized关键字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。
当把代码改成如下:Synchronized关键字才会起作用
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
JAVA线程的四种状态
线程有四种状态,任何一个线程肯定处于这四种状态中的一种:
1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。
2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。
3) 死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。
4) 停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。
发表评论
-
Java通过Executors提供四种线程池
2017-09-27 10:21 467Java通过Executors提供四种线程池,分别为: new ... -
并发线程组件 Amino
2013-07-23 13:29 693Amino CBB (Concurrent Building ... -
Java多线程之Semaphore
2013-07-17 16:12 581import java.util.ArrayL ... -
ThreadLocal的介绍(利用变量副本实现多线程访问同一变量)
2013-07-17 14:20 802早在Java 1.2推出之时,Ja ... -
ThreadGroup其实比ExecutorService更好
2013-07-17 13:32 701用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多 ... -
Java多线程同步器
2013-07-12 17:00 860CyclcBarrier 在实际应用中,有时候需要多个线程 ... -
Java Thread.interrupt 害人! 中断JAVA线程
2013-07-12 16:37 767程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Java多线程学习——Condition的使用
2013-07-12 14:36 834Condition 将 Object 监视器方法(wait、n ... -
java多线程设计wait
2013-07-12 14:30 693在Java中,这个机制的实 ... -
Monitor
2013-07-12 10:44 15331. 什么是Monitor? Monitor其实是一 ... -
处理 子线程的返回值
2013-07-08 14:19 859package com.jimmy.Thread.Conc ... -
ExecutorService的execute和submit方法
2013-07-05 17:21 1032因为之前一直是用的exec ... -
Exchanger-兄弟线程的信息交换
2013-07-05 16:23 696如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使 ... -
lockInterruptibly 和lock的区别
2013-06-26 16:36 886lockInterruptibly 与 lock比较区别在于 ... -
慎重使用volatile关键字
2013-06-26 11:10 743volatile关键字相信了解Java多线程的读者都很清楚它的 ... -
对synchronized(this)的一些理解
2013-06-26 10:18 673一、当两个并发线程访问同一个对象object中的这个synch ... -
java中的lock和synchronized区别
2013-06-26 10:02 5881、ReentrantLock 拥有Synchronized相 ... -
初学Java多线程:慎重使用volatile关键字
2013-02-25 15:18 693学习Java多线程中会遇到使用volatile关键字的情况。v ... -
java之yield(),sleep(),wait()区别详解-备忘笔记
2013-02-25 14:32 6321、sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
Java Thread join() 的用法
2013-02-25 13:24 587Java Thread中, join() 方法主要是让调用改方 ...
相关推荐
本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...
本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它允许当前正在执行的线程在指定的毫秒数内暂停执行。...
本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。 Java线程调度...
"高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别" 本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要...
需要注意的是,`yield()`并不会像`sleep()`或`join()`那样使线程进入等待状态,而是让线程回到可运行状态,这意味着线程仍然可以随时被调度执行。 使用`yield()`的主要目的是提高线程的公平性,尤其是当有多个线程...
一个线程调用另一个线程的join()方法,会等待该线程执行完毕后再继续执行,可以用来控制线程的执行顺序。 8. Volatile关键字: Volatile关键字可以保证线程间变量的可见性,但不能保证原子性。在多线程环境下,...
- **定时等待(Timed Waiting)**:线程处于有限期等待状态,如调用了`sleep()`或`join()`方法。 - **终止(Terminated)**:`run()`方法执行完毕或抛出未捕获异常。 3. **线程控制** - **sleep()**:让当前线程...
3. Yield:当前线程主动放弃CPU时间片,让其他线程有机会执行。 五、线程优先级 每个线程都有一个优先级,但操作系统并不保证优先级高的线程一定先执行,而是尽可能给予较高优先级的线程更多执行机会。 六、后台...
Java中控制线程的方法有多种,如start()启动线程,run()执行线程,sleep()让线程休眠,join()等待其他线程完成,yield()让当前线程暂停,让其他线程有机会执行,以及interrupt()和isInterrupted()用于中断和检查线程...
在 Java 中,线程的 join 方法可以让一个线程等待另外一个线程的执行完成。join 方法可以确保一个线程在另外一个线程执行完成后继续执行。 在 Java 中,线程的 sleep 方法可以让线程暂停执行一段时间。sleep 方法...
`start()`方法启动线程,`sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断...
Java虚拟机提供了`Thread.sleep()`,`Thread.yield()`和`Thread.join()`等方法来影响线程调度。`sleep()`使当前线程进入阻塞状态,定时后自动恢复到就绪状态;`yield()`让当前线程短暂放弃CPU,但不保证一定让其他...
- `join()`方法让调用的线程等待目标线程执行完毕后再继续执行。 2. **`synchronized`关键字**: - `synchronized`用于实现线程同步,防止数据的不一致性。它可以修饰方法或代码块,当一个线程进入同步块/方法后...
- **方法**: `sleep()`、`join()`、`yield()`、`wait()`、`notify()` / `notifyAll()` - **功能**: - `sleep()`: 使当前线程暂停指定的时间。 - `join()`: 当前线程等待另一个线程结束。 - `yield()`: 让出CPU给...
- `join()`:等待当前线程死亡,如果线程被中断,则会抛出异常。 - `yield()`:停止当前线程执行,将CPU控制权交给其他线程。 - `stop()`:强制停止线程。 - `suspend()`:暂停线程执行,但不退出可执行状态。 - `...
Java提供了多种控制线程的方法,如start()启动线程,run()执行线程任务,sleep()让线程暂时休眠,join()等待其他线程结束,yield()让当前线程暂停,让其他线程有机会运行,以及设置优先级等。 并发控制是多线程编程...
join()方法用于等待线程结束,yield()方法使当前线程暂停并让同优先级的线程有机会执行。 五、线程的同步与互斥 为了解决多个线程访问共享资源时可能出现的竞态条件,Java提供了同步机制,主要包括synchronized...
线程控制包括启动线程(start()),线程同步(synchronized关键字,wait(),notify(),notifyAll()),线程休眠(sleep()),线程让步(yield()),以及线程的停止(stop(),不推荐使用,因为不安全)。 - sleep()...