`

关于线程中的阻塞

 
阅读更多

在线程中往往需要做一些阻塞,但是如果每次都是写一个循环,那不就很冗余,可以把睡眠的代码分离出来,如果停止睡眠就把sleep设置为false。 

这样的设置其实是为了减少调用Thread.sleep的延误,比如说,你是Thread.sleep(30000),那么你在这30000毫秒的时间内,你是做不了事情的,但是如果你是new了MySleep的类,你就可以控制在这30000的时间内何时跳出睡眠。你可以把时间单位调低一点,就可以更加精准了。 

 

public class MySleep {
	private long sleepTime = 0;//要阻塞的时间
	private long format = 100;//阻塞时间的单位,如果对具体时间没有精确的要求,可以将它设置到1000
	private boolean sleep = true;
	public MySleep(){};
	
	public MySleep(long t){
		sleepTime  = t;
	}
	
	public void setSleepTime(long t){
		sleepTime = t;
	}
	
	public void setSleepTime(long t,long f){
		sleepTime = t;
		format = f;
	}
	
	public boolean isSleep() {
		return sleep;
	}

	public void setSleep(boolean sleep) {
		this.sleep = sleep;
	}

	public void start(){
		System.out.println("******      阻塞开始       *****");
		while(sleep){
			if(sleepTime > 0){
				try {
					Thread.sleep(format);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				sleepTime -= format;
			}else{
				sleep = false;
			}
		}
		System.out.println("*****      阻塞完成        ******");
		System.out.println("睡眠时间还有" + sleepTime);
	}
}
public class TT {
	private static myRunnable r1 = new myRunnable(3000);
	private static myRunnable r2 = new myRunnable(10000);
	private static myRunnable r3 = new myRunnable(5100);
	
	public static void main(String[] args) {
		Thread  t1 = new Thread(r1);
		t1.start();
		Thread  t2 = new Thread(r2);
		t2.start();
		Thread  t3 = new Thread(r3);
		t3.start();
		
		Thread stopThread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				new MySleep(4000).start();
				r1.setSleep(false);
				r2.setSleep(false);
				r3.setSleep(false);
			}
		});
		stopThread.start();
	}

}

class myRunnable implements Runnable{
	MySleep mySleep;
	public myRunnable(int sleepTime){
		mySleep = new MySleep();
		mySleep.setSleepTime(sleepTime, 100);
	}
	@Override
	public void run() {
		System.err.println(DateUtil.getNewDate(DateUtil.HMS1));
		mySleep.start();
		System.err.println(DateUtil.getNewDate(DateUtil.HMS1));
		
	}
	
	public void setSleep(boolean sleep){
		mySleep.setSleep(sleep);
	}
}

 

 

分享到:
评论

相关推荐

    C#多线程不阻塞

    本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步方法调用是传统的调用方式,当一个线程调用一个函数,如`Foo()`,它会等待...

    socket 多线程 例程 非阻塞模式

    在这个"socket多线程例程非阻塞模式"的示例中,我们将深入探讨如何在Windows平台上实现多线程的socket通信,并了解非阻塞模式的工作原理。 首先,让我们来理解Socket的基本概念。Socket是进程间通信(IPC)的一种...

    C++封装类CWSocket(多线程 非阻塞)

    本文将详细解析标题为“C++封装类CWSocket(多线程 非阻塞)”的项目,以及其在实际应用中的重要性和实现方式。 首先,我们来理解“CWSocket”这个类。CWSocket是C++中一个自定义的类,它对标准的socket API进行了...

    Java Socket学习---单线程阻塞

    在这个单线程阻塞模型中,如果客户端发送了一个请求,它会等待服务器的响应,期间不能执行其他任务,直到数据接收完毕。 在实际应用中,单线程阻塞模型可能不是最优选择,因为它无法同时处理多个客户端请求。为了...

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    winsock多线程阻塞通信

    本实验“winsock多线程阻塞通信”主要关注如何在多线程环境中使用Winsock进行阻塞式的网络通信,这是一种基础但重要的编程技术,尤其在服务器端编程中广泛应用。 首先,我们要理解什么是阻塞与非阻塞模式。阻塞模式...

    python多线程非阻塞socket

    在Python编程中,多线程和非阻塞的Socket技术是构建高效网络应用程序的关键组成部分。本文将深入探讨如何在Python中实现多线程非阻塞的Socket服务端和客户端,以提升并发处理能力。 首先,让我们理解“多线程”和...

    实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)

    在标题和描述中提到的“实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)”是一个典型的并发编程问题,涉及到线程管理和通信。以下是对这个主题的详细讲解: 1. **线程与并发**: - 线程是程序执行的最小...

    QT-线程阻塞问题-开启多线程(帮助你快速解决因大量计算耗时而导致主线程渲染阻塞的问题、简单实现多线程教学)

    我们经常会进行一些比较复杂的计算和算法实现,或者是在某些特定的情况下会实例化一些类。...可以通过开启子线程,将复杂计算内容交给子线程来处理,主线程主要进行UI的渲染操作,这样同样能够解决线程阻塞的问题。

    线程中创建子线程

    在计算机编程中,多线程是一种并发执行任务的机制,它可以极大地提高程序的执行效率,尤其是在处理大量数据或需要同时进行多个操作时。本主题主要关注如何在已有的线程中创建子线程,实现更复杂的并发执行模式。 ...

    c++与Qt实现把定时器放进子线程中运行

    在GUI应用程序中,通常主线程负责处理用户界面的更新,而其他任务则应放在子线程中处理,以免阻塞主线程,导致UI响应变慢。标题和描述所提到的是如何将QTimer对象放置到子线程中运行,以实现定时器槽函数与QTimer在...

    java 同步阻塞并唤醒指定线程

    总的来说,理解并熟练掌握Java中的多线程同步和阻塞机制对于编写高效且线程安全的代码至关重要。通过合理使用`synchronized`、`wait()`, `notify()`和`notifyAll()`,以及高级并发工具,开发者可以构建出复杂且可靠...

    Linux下多线程的阻塞模式下的socket编程

    在实际应用中,多线程阻塞模式的socket编程需要注意线程安全问题,比如避免多个线程同时访问同一资源,可能需要使用互斥锁(mutex)等同步机制。此外,合理的错误处理和异常控制也是保证程序健壮性的重要环节。 ...

    普通的SOCKET多线程阻塞模型

    "普通的SOCKET多线程阻塞模型"是指使用标准的Socket接口,结合多线程技术实现的一种通信模型,它广泛应用于VC(Visual C++)开发环境中。在这一模型中,每个线程负责处理一个连接,当线程在进行读写操作时,如果数据...

    单线程阻塞tcp server&client程序

    通过阅读和分析这些代码,我们可以了解如何在C++环境中使用Winsock库来实现单线程阻塞TCP Server和Client。 Winsock是Windows操作系统中的一个API,提供了对TCP/IP协议的支持。开发者可以通过Winsock API创建网络...

    C++在多线程中使用mciSendString播放音乐demoB

    总结来说,"C++在多线程中使用mciSendString播放音乐demoB"展示了如何结合C++的多线程特性与Windows MCI服务来实现非阻塞的音乐播放。这涉及创建线程,定义线程函数,以及正确使用mciSendString函数发送播放命令。...

    在独立线程中显示WPF窗口

    在WPF(Windows Presentation Foundation)应用开发中,有时我们需要在独立的线程中显示窗口,以避免阻塞主线程,提升用户体验。标题“在独立线程中显示WPF窗口”和描述提到了这一关键概念,这涉及到多线程技术以及...

    qt编程_在子线程中更新UI界面

    然而,当执行耗时的操作,如网络请求、大数据处理或长时间计算时,如果在主线程中执行,会阻塞UI,导致界面无响应,用户体验下降。为了解决这个问题,我们可以将这些操作放在子线程中执行,然后通过特定机制更新UI。...

    java关于线程的实验代码

    在Java编程中,线程是程序执行的独立路径,它允许多个任务同时进行,极大地提高了程序的效率和响应性。本实验代码基于《Java大学教程(第三版)》中的线程相关课题,旨在帮助学习者深入理解Java线程的概念、创建与...

    vc++中的线程锁(线程锁保持线程同步)

    在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...

Global site tag (gtag.js) - Google Analytics