`

多线程——休眠(sleep)

    博客分类:
  • java
阅读更多

先抛出一问题?

都说sleep与yield有哪些哪些的区别,那我问:

sleep(0)与yield()有什么区别呢?

相关的说明晚上发布,白天估计没时间写,工作要紧。

本来晚上来发布的,关键时候,电脑没带回来,哈哈,明天一定补上。

其实后面几点

sleep,yield,join,priority与daemon都比较简单,用几个例子说明一下就可以。打算一次性把例子全放上,再分析一下这些方法的作用,基本上就OK了。

 

只有到线程池才又是一重点。

 

更新开始:

 

先来回答上面的问题:

两者的区别在于,一个调用的是本地的native void sleep(millis)方法,一个是调用的是本地的native void yield()方法。

由于具体的代码看不到:

只能功能分析:

因为sleep方法调用后,不会释放锁,只是暂停执行而已;与yield()方法调用后是一样的。

别的功能基本上是一样的。所以本地方法中可能在sleep(millis)中系统计算时间,当millis到0时,再调用与yield一样的处理方式。

yield()方法不会释放锁,这点在API中没有说明,不过可以通过下面的例子进行测试:

package thread;

import java.util.concurrent.locks.ReentrantLock;

public class YieldSleepThread {
	public static void main(String[] args) {
		Long t_start = System.currentTimeMillis();

		User_lock u = new User_lock("张三", 0);
		Thread_lock t1 = new Thread_lock("线程A", u, 20);
		Thread_lock t2 = new Thread_lock("线程B", u, -30);
		Thread_lock t3 = new Thread_lock("线程C", u, -40);
		Thread_lock t4 = new Thread_lock("线程d", u, -50);
		Thread_lock t5 = new Thread_lock("线程e", u, -60);
		Thread_lock t6 = new Thread_lock("线程f", u, -70);
		Thread_lock t7 = new Thread_lock("线程g", u, -80);

		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
		t7.start();

		/**
		 * 以下代码用于计算时间,当然,它本身的运行也会需要一点点时间,但与分析运行效率无影响
		 */
		boolean flag = true;
		while (flag) {
			if (Thread_lock.activeCount() == 1) {
				Long t_end = System.currentTimeMillis();
				System.out.println("当前时间:" + (t_end - t_start));
				flag = false;
			}
		}
	}
}

class Thread_lock extends Thread {
	private User_lock u;
	private int y = 0;

	Thread_lock(String name, User_lock u, int y) {
		super(name); // 线程的名称
		this.u = u;
		this.y = y;
	}

	public void run() {
		u.oper(y);
	}
}

class User_lock {
	private String code;
	private Integer cash;

	User_lock(String code, int cash) {
		this.code = code;
		this.cash = cash;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	/**
	 * 业务方法
	 * 
	 * @param x
	 *            添加x万元
	 */
	public synchronized void oper(int x) {
//		try{
			System.out.println("Thread.currentThread().getName()"+Thread.currentThread().getName());
//			Thread.sleep(0);// 作用:增加运行时间
			for(long i=0;i<9999999;i++);
			Thread.yield();

			this.cash += x;
			System.out.println(Thread.currentThread().getName() + "  运行结束1,增加“"
					+ x + "”,当前用户信息:" + toString());
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		} 
	}

	@Override
	public String toString() {
		return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';
	}
}

 

  运行结果:

 

Thread.currentThread().getName()线程A
线程A 运行结束1,增加“20”,当前用户信息:User{code='张三', cash=20}
Thread.currentThread().getName()线程d
线程d 运行结束1,增加“-50”,当前用户信息:User{code='张三', cash=-30}
Thread.currentThread().getName()线程C
线程C 运行结束1,增加“-40”,当前用户信息:User{code='张三', cash=-70}
Thread.currentThread().getName()线程e
线程e 运行结束1,增加“-60”,当前用户信息:User{code='张三', cash=-130}
Thread.currentThread().getName()线程f
线程f 运行结束1,增加“-70”,当前用户信息:User{code='张三', cash=-200}
Thread.currentThread().getName()线程B
线程B 运行结束1,增加“-30”,当前用户信息:User{code='张三', cash=-230}
Thread.currentThread().getName()线程g
线程g 运行结束1,增加“-80”,当前用户信息:User{code='张三', cash=-310}
当前时间:547 

很明显的一点,就是我的机子比较慢,应该在200左右的比较正常。

 

从上面的例子可以看到,不会释放锁;可以把上例子中的synchronized关键字去掉,试试,输出不会是A->A的。

 

还是回到sleep方法上来。

sleep(long millis, int nanos)或sleep(long millis)

其实nanos这个参数没多大用可以看这句:

if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
     millis++;
 }

 

所以,加个50000以下的,系统根本不算。哎!这东西就是骗人用的。

 

再说一下,因为sleep()方法让当年线程暂停执行,那么别的线程都可能能获取CPU,这也就为相对于,线程优先级比较低的也可能获取。(sleep(0)就先不说了,还是用yield()代替吧。)而yield()方法只是停下,接着去抢CPU,所以优先级低的,还是很难与高的相抢。

 

还有一点要说明的是sleep()会抛异常?

 

什么时候会出现这种情况呢?比如还在sleep的过程中,你突然想interrupte一下,是的,这个时候就要也异常了,不过这种异常没关系,你只要过滤一下就OK了,但是记住,如果不加,就是报错了。(现在都用IDE写代码,这种问题会自报。)

 

先到这里了。

 

 

Java多线程及线程池专题http://ciding.iteye.com/blog/1300110

 

 

分享到:
评论
2 楼 ciding 2011-12-29  
优先级这个,与线程机制有关。

上面这么说,主要是想区别一下sleep()与yield()。

线程的调度是比较复杂的,不只与优先级相关。(这点没在上面说明,现在说明一下,以免误会)
1 楼 javaeyehoney 2011-12-29  
,所以优先级低的,还是很难与高的相抢。

相关推荐

    C#多线程——关于C#多线程的一个技术文档

    C#多线程技术文档详解 C#编程语言在处理多线程方面提供了丰富的功能,这些功能主要集中在System.Threading命名空间中。在开始探讨多线程之前,首先需要确保在代码中引入该命名空间,使用`using System.Threading;`...

    JAVA多线程——一篇文章让你彻底征服多线程开发.docx

    ### JAVA多线程详解 #### 一、线程与进程的概念 在计算机科学中,**进程**是指一个正在运行的应用程序或程序实例,而**线程**则是进程中可并发执行的一部分,是进程内的一个执行流。一个进程可以拥有多个线程,这些...

    java第十章答案JAVA多线程——一篇文章让你彻底征服多线程开发

    ### Java多线程详解 #### 一、线程与进程的概念 在计算机科学中,**进程**是指一个正在运行的应用程序或程序实例,而**线程**则是进程中可并发执行的一部分,是进程内的一个执行流。一个进程可以拥有多个线程,这些...

    java多媒体与多线程处理实验

    1. **多线程程序设计**:实验要求设计一个包含四个线程的程序,通过`Thread.sleep()`模拟线程的“睡眠”和“醒来”,观察线程调度机制。 2. **Applet时间显示**:开发一个Applet程序显示时间,并具备挂起和恢复功能...

    操作系统实验:多线程并发程序设计模拟生产者消费问题

    操作系统实验中的多线程并发程序设计是解决经典并发问题——生产者消费者问题的一种方式。生产者消费者问题是进程间通信和同步的经典案例,涉及到共享资源的访问控制和线程的协作。在这个实验中,我们将创建两个线程...

    Java多线程运算集合

    ### Java多线程运算集合知识点解析 #### 一、Java多线程概念与原理 - **操作系统中的线程与进程**: - **进程**:指的是一个正在运行的应用程序,每个进程都拥有独立的内存空间。 - **线程**:是进程中的一个...

    Java 语法总结——线程(线程)

    5. 线程休眠:通过Thread.sleep(long milliseconds)使线程进入阻塞状态,指定时间后自动恢复。 6. 线程join():让当前线程等待指定线程执行完毕后再继续执行。 五、线程优先级 Java提供10级线程优先级,通过set...

    JAVA多线程同步机制及其应用.doc

    本文档详细介绍了Java中多线程的相关概念、创建方式、线程管理、同步机制以及一个实际的应用案例——交通灯管理系统。 首先,线程是程序执行的最小单元,一个进程可以包含多个线程。在Java中,创建线程有两种主要...

    PyQt5自学记录(1)——PyQt5多线程实现详解

    在PyQt5编程中,多线程的使用是解决 GUI 应用程序中长时间运行的任务导致界面卡死问题的关键。本篇文章将详细讲解如何在PyQt5中实现多线程,以便于创建高效的图形用户界面。 首先,了解基础概念:线程是一个轻量级...

    Java面试之——线程编程方面

    - `sleep()`是`Thread`类的方法,让当前线程休眠指定时间,不释放对象锁,醒来后继续执行。 - `wait()`是`Object`类的方法,让线程等待直到被`notify()`或`notifyAll()`唤醒,释放对象锁。 5. **同步与异步**: ...

    java十大经典案例——时钟显示

    本案例“Java十大经典案例——时钟显示”旨在深入探讨Java的多线程特性,通过实现一个实时更新的时钟显示程序来阐述相关知识。在Java中,多线程是并发执行任务的关键机制,它允许程序同时处理多个任务,从而提高效率...

    实现休眠计算机,并创建快捷键VC实现

    但请注意,为了使这个程序在没有用户界面的情况下运行,我们需要将它转换为非GUI程序,这通常涉及到多线程和消息循环的复杂处理。在实际应用中,你可能还需要处理错误、添加用户界面提示等细节。 在提供的压缩包...

    用多线程同步方法解决生产者-消费者问题(操作系统课设)

    #### 二、解决方案——多线程同步方法 针对生产者-消费者问题,多线程同步方法提供了一种有效且可靠的解决方案。在本课程设计中,采用的是Linux环境下的C语言编程,利用了信号量(Semaphore)和互斥锁(Mutex)来...

    java课程设计 三线程接力

    在Java中,可以使用`Thread.sleep()`方法来实现线程的短暂休眠,或者使用`ScheduledExecutorService`来实现更复杂的定时任务。 5. **事件驱动编程**:这个设计可能涉及到GUI(图形用户界面)编程,如Swing或JavaFX...

    3应用 2:缓兵之计 —— 延时队列(1).md

    为了解决这个问题,通常会在客户端中引入休眠机制,比如使用sleep函数让线程暂停一定时间。这种策略虽然可以减少资源消耗,但会增加消息处理的延迟。为了避免这种延迟,可以使用blpop(阻塞读取左侧元素)和brpop...

    java课程设计报告---红绿灯控制道路车辆.docx

    这个系统利用Java的多线程特性,将每辆车辆和红绿灯分别看作独立的线程,实现了交通流的动态模拟。 1. **多线程概念** 在Java中,多线程允许程序同时执行多个任务。在这个项目中,车辆和红绿灯都有各自的线程,这...

    android 应用 源代码——定时器

    除了`java.util.Timer`,Android还提供了一些其他的定时方案,如Handler、Runnable配合Thread.sleep(),以及更现代的`android.os.AsyncTask`、`CountDownTimer`、`AlarmManager`等。这些工具各有优缺点,适用于不同...

    java龟兔赛跑tortoise-master.zip

    通过控制每个线程的休眠时间(Thread.sleep()),可以模拟出不同速度的效果。例如,兔子线程可能在每次移动后休息更长时间,以体现其快速但易分心的特点。 此外,代码可能还包含了主程序类,它负责创建乌龟和兔子的...

Global site tag (gtag.js) - Google Analytics