`

【线程】中断的调用与处理以及设置线程超时

    博客分类:
  • Java
 
阅读更多

线程中断

 

        //中断主线程
        Thread.currentThread().interrupt();//线程自己中断自己
       
        Thread worker = new Thread();
        worker.start();
       
        worker.interrupt();//线程A中断线程B
       
        Thread.interrupted();//检测中断状态,并清除中断状态,中断标记置为false
        
        worker.isInterrupted();//检测中断状态,不会改变中断状态

 

package org.thread;

public class InterruptDemo1 {
	
	public static void main(String[] args) {
		//中断主线程
		Thread.currentThread().interrupt();
		
		Worker worker = new Worker();
		Thread t = new Thread(worker);
		t.start();
		
		System.out.println("Main Thread.isInterrupted: "+Thread.currentThread().isInterrupted());

		try {
			Thread.sleep(100);//由于主线程处于中断状态,调用sleep()将会抛出InterruptedException
		} catch (InterruptedException e) {
			/**
			 * 在catch块中捕获到被抛出的Interrupted异常时,被中断线程的中断状态已经被清空(中断状态=false),以便确保该线程处于正常状态继续执行
			 * 因为中断仅仅是立即停止线程当前正在做的事,在catch到中断之后,可以让该线程去做另一件事情,所以进入catch块时中断状态实际上已经置为false了!
			 * 至于如何处理中断异常,需要根据具体情况而定:
			 * 	1. return 退出循环/方法
			 *  2. 抛出InterruptedException到上层
			 * 	3. 返回到线程池中,继续准备为下一个请求进行服务 
			 */
			System.out.println("The interrupted status of the current thread is cleared when this exception is thrown.");
			System.out.println("Main Thread.isInterrupted: "+Thread.currentThread().isInterrupted());//false
			//Clear Interrupted status, just make sure. Don't confused!
			Thread.interrupted();
			System.out.println("Main Thread.isInterrupted: "+Thread.currentThread().isInterrupted());//false
		}
		
		t.interrupt();
	
	}
	
	private static class Worker implements Runnable {

		@Override
		public void run() {
			//doWork01();
			doWork02();
		}
		
		/**
		 * 此循环不会因为别的线程调用了本线程的interrupt()而停止
		 * 因为,既没有中断异常的捕获,也没有中断状态的检测,所以,程序不会对中断做出任何响应
		 */
		private void doWork01() {
			while(true)
				System.out.println("Interrupte Has No Effect To Me!");
		}
		
		/**
		 * 在循环中主动检测中断状态,当发现自己被中断时,退出
		 */
		private void doWork02() {
			while(true) {
				System.out.println("Because there is no interruptedException can be thrown, so we need to check 'interrupt status' ourselves!");
				if(Thread.currentThread().isInterrupted()) {//or Thread.interrupted()
					System.out.println("We have been interrupted, so just stop the work and return to home!");
					return;
				}
			}
		}
		
	}
}

 

 

 

超时后中断线程:

 

package org.thread;

/**
 * 监视线程,超时便中断 
 */
public class InterruptDemo2 {
	
	public static void main(String[] args) throws InterruptedException {
		Worker worker = new Worker();
		Thread t = worker.work();
		
		int patience = 5000;//5s
		long start = System.currentTimeMillis();
		
		while(t.isAlive()) {
			printMessage("Still waiting...");
			t.join(1000);//主线程等待1s后再执行
			if(System.currentTimeMillis()-start > patience && t.isAlive()) {
				printMessage("Tired of waiting!!!");
				t.interrupt();
				t.join();//主线程无限等待,直到t线程结束后,主线程才继续往下执行
			}
		}
		
		System.out.println("Over!");
		
	}
	
	private static void printMessage(String message) {
		String tName = Thread.currentThread().getName();
		System.out.format("%s: %s%n", tName, message);
	}
	
	private static class Worker implements Runnable {
		
		final String[] messages = {"AAAAA","BBBBB","CCCCC","DDDD"};

		@Override
		public void run() {
			for(int index=0; index<messages.length; index++) {
				try {
					Thread.sleep(2000);
					printMessage(messages[index]);
				} catch (InterruptedException e) {
					printMessage("Not finished");
					return;
				}
			}
		}
		
		public Thread work() {
			Thread t = new Thread(this);
			t.start();
			return t;
		}
	}
	
}

 

分享到:
评论

相关推荐

    java通过线程控制程序执行超时(新)

    总结起来,Java通过线程控制程序执行超时是通过结合线程机制、Future/Callable接口以及中断机制实现的。在设计和实现超时控制时,要考虑到基本数据类型和反射的应用,以满足各种复杂的需求。合理地使用这些工具,...

    .net c#线程超时解决方案

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    Java线程超时监控

    在这种情况下,`join`方法会让调用线程等待,直到目标线程结束或超时。如果超时,当前线程将恢复执行,并且可以通过调用`interrupt`来中断目标线程(但这并不意味着目标线程会立即停止,它可能需要在内部检查`...

    java通过线程控制程序执行超时

    例如,以下代码展示了如何创建一个线程并设置超时: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future&lt;String&gt; future = executor.submit(new Callable() { @Override public ...

    libevent多线程处理

    6. **回调函数**: 编写回调函数以处理各种事件,如新的客户端连接、数据接收、超时等。 7. **错误处理**: 实现适当的错误处理机制,确保在出现异常时能正确地关闭资源并记录错误。 通过这种方式,我们可以利用...

    ZYNQ进阶之路14”博客对应源代码,该代码通过FIFO阈值触发中断和超时中断实现ZYNQ PS端uart接收不定长数据.zip

    4. **超时管理**:配置定时器,设置超时时间,处理超时中断事件。 5. **中断处理**:在主循环中,调用中断服务例程并清除中断标志,以防止重复处理同一中断。 在实际应用中,可能还需要考虑到错误处理、多线程同步...

    curl线程池多线程调用

    这样不仅可以方便地管理和控制并发请求,还能灵活地处理结果,比如设置超时、重试策略等。 文件"CurlHighSpeed"可能包含了实现上述功能的示例代码或详细教程,可以帮助我们深入理解和实践`curl`的多线程线程池技术...

    .net C#线程超时

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    EJB超时调用

    EJB超时调用是指在EJB方法执行过程中,如果超过了预设的时间限制(即超时时间),系统会抛出异常并中断该方法的执行。这种情况通常发生在远程方法调用(Remote Method Invocation, RMI)或并发操作中,可能由于网络...

    线程调用方法

    在Java或C#等支持多线程的语言中,理解和掌握线程的退出码以及线程同步是开发高效并发程序的基础。 线程的退出码通常用于传递线程执行结束时的状态信息,这在某些情况下非常有用,例如,当需要知道一个后台任务是否...

    线程调用进程设计文档1

    以下将详细阐述线程调用进程可能遇到的问题、预防措施以及可能的解决方案。 1. 风险分析 线程调用进程的主要风险在于可能导致死锁。当一个线程正在执行,并持有资源锁(如互斥量)时,如果在这个时刻调用了`fork()`...

    BlockingQueue队列自定义超时时间取消线程池任务

    在超时后,我们可以调用`cancel`方法尝试取消任务,但要注意的是,只有当任务尚未开始执行或者正在执行的任务可以被中断时,`cancel`方法才能成功。 以下是一个简单的示例: ```java ExecutorService executor = ...

    java多线程详解(比较详细的阐述了多线程机制)

    Java多线程还涉及到线程中断和异常处理,Thread类提供了interrupt()方法发起中断请求,线程可以通过检查isInterrupted()或isInterrupted()状态响应中断。在多线程环境中,异常处理也需特别注意,合理的try-catch-...

    java 多线程并发实例

    在线程A调用wait()后,A会被阻塞并释放锁,等待其他线程调用notify()或notifyAll()唤醒。使用这些方法时,必须在同步块或同步方法中,否则会抛出IllegalMonitorStateException。 - 生产者-消费者模型:这是一个经典...

    Java线程超时控制的实现.docx

    ### Java线程超时控制实现详解 #### 一、引言 在开发过程中,经常会遇到需要对线程执行时间进行限制的情况,例如与远程数据库的交互或网络数据的下载等耗时操作。为了提高程序的健壮性和用户体验,合理地控制这些...

    Java 实例 - 中断线程源代码+详细指导教程.zip

    7. **线程池与中断**:在使用ExecutorService等线程池时,可以使用`Future.cancel(true)`来尝试中断任务。这不仅会设置中断标志,还会请求线程池终止执行。 8. **finally块中的清理**:即使在中断后,也应确保在...

    如何用Java回调和线程实现异步调用.pdf

    "如何用Java回调和线程实现异步调用" 在软件开发中,异步调用是一种非阻塞式调用方式,用于在处理比较耗时的任务...通过使用Java回调和线程机制,可以实现异步调用,解决程序阻塞问题、异步消息的传递问题和超时问题。

    线程及线程应用总结

    线程在IT行业中是多任务并行处理的关键概念,它使得程序可以在同一时间执行多个不同的任务,极大地提高了程序的效率和响应性。本篇将基于提供的文件名来探讨线程的相关知识点及其应用。 1. **线程基础** - 线程是...

    Linux系统下的多线程编程入门.pdf

    本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...

    C++多线程基类C++多线程基类C++多线程基类

    由于C++标准库并不提供内置的线程支持,所以在使用多线程时需要谨慎处理并发访问的数据结构,并确保正确地同步和保护共享资源。 此外,线程的生命周期管理也很重要。创建线程后,必须确保线程能够正确地终止并清理...

Global site tag (gtag.js) - Google Analytics