0 0

多线程sleep与interrupt性能30

一个管理线程ManagerThread,多个业务线程BusinessThread
管理线程获得数据后,需要交给业务线程处理,平时业务线程都是sleep状态,由管理线程决定唤起哪几个业务线程。
两种方式可用:
1.BusinessThread一直都sleep,直至ManagerThread调用interrupt中断,执行完业务后继续sleep;
2.BusinessThread加个wakeup的标识属性,循环sleep(1000),每个循环间隙去判断自身标识属性,来确定是否执行业务。
由于业务线程可能要求比较多,所以需要评估一下性能,
我觉得1用的资源比较少,但2比较灵活,但是不确定,1和2哪种更合理。

问题补充:以前用过线程池,但是创建与释放过于频繁,一段时间后容易出现out of memory之类的异常。当然跟jvm参数配置不当也有关,但是线程稳定的话,异常几率大幅减少。
2013年7月09日 09:40

6个答案 按时间排序 按投票排序

0 0

线程池创建和释放线程不可能有内存问题,除非你的线程池最大线程数过大,并且过期销毁的时间太长。

2013年7月11日 12:58
0 0

性能上肯定是第一种模型性能好,
但不推荐用 sleep interrupt ,java 的 wait 和 notify 就是可以,用来减少 cpu 轮询.

附上一个最最简单的实现:

public class MainTest {

	public static Object lock = new Object();

	public static void main(String[] args) throws InterruptedException {
		ThreadClass t1 = new ThreadClass();
		ThreadClass t2 = new ThreadClass();
		ThreadClass t3 = new ThreadClass();

		t1.start();
		t2.start();
		t3.start();
		
		synchronized (lock) {
			lock.notifyAll();
		}
	}

	public static class ThreadClass extends Thread {
		@Override
		public void run() {
			System.out.println(this.getId() + ",run");
			synchronized (lock) {
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// TODO 获取任务对象,跳出synchronized 模块,否则继续wait
			}
		}
	}
}



不过猜测楼主的业务是:
要为每个业务线程都加一个锁对象,当这个业务线程应该开始去执行的时候,就去 调用这个业务线程使用的锁对象的 notify ,就可以了.

2013年7月11日 10:14
0 0

package thread.iteye;

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

public class ThreadTest {

    public static void main(String[] args) {
        Queue<Object> tasks = new ArrayBlockingQueue<Object>(10);
        ManagerThread mt = new ManagerThread(tasks);
        BusinessThread bt = new BusinessThread(tasks);
        BusinessThread bt1 = new BusinessThread(tasks);
        mt.start();
        bt.start();
        bt1.start();
    }
}

class ManagerThread extends Thread{
    private Queue<Object> tasks;
    public ManagerThread(Queue<Object> tasks){
        this.tasks = tasks;
    }
   
    public void run(){
        while(true){
            addTask();
            if(!tasks.isEmpty()){
                synchronized(tasks){tasks.notify();}//唤醒消费者
            }
        }
           
    }
   
    public void addTask(){
        if(tasks.size()<10){
            tasks.add("aaa");
        }
    }
}

class BusinessThread extends Thread{
    private Queue<Object> tasks;
    public BusinessThread(Queue<Object> tasks){
        this.tasks = tasks;
    }
    public void run(){
        while(true){
            Object task = tasks.poll();
            //some code  do task
            if(task!=null){
                execute(task);
                try {
                    synchronized(tasks){tasks.wait();}//等待下次任务
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
           
        }
    }
   
    public void execute(Object task){
        try {
            Thread.sleep(10000);//执行任务需要一定时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" execute aaa");
    }
}

2013年7月10日 11:47
0 0

典型的ThreadPoolExecutor的使用场景,用JDK的ThreadPoolExecutor线程池就可以很好的满足你的需求。

2013年7月09日 17:56
0 0

这不是典型的生产者消费者的场景,搞这么麻烦?

2013年7月09日 12:00
0 0

建议用java.util.concurrent里面的类来进行多线程管理,维护一个线程池,需要的时候创建多个线程来完成任务,任务执行完毕线程销毁,可以少去维护线程的开销。

2013年7月09日 11:09

相关推荐

    java多线程Demo

    3. 多线程同步与通信: 在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享...

    java线程中断之interrupt和stop.docx

    在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种方式来实现这些功能,其中`interrupt`和`stop`是最常用的方法。本文将...

    Java多线程机制(讲述java里面与多线程有关的函数)

    挂起线程通常通过调用`sleep()`或`wait()`方法实现,恢复线程可能通过`notify()`或`notifyAll()`唤醒,终止线程则可以通过`interrupt()`方法发送中断请求,但线程本身需要检查`isInterrupted()`或`...

    深入分析JAVA 多线程--interrupt()和线程终止方式

    JAVA 多线程 interrupt() 和线程终止方式 JAVA 多线程中,interrupt() 和线程终止方式是两个非常重要的概念。本文将深入分析 JAVA 多线程中 interrupt() 和线程终止方式的相关知识。 一、interrupt() 介绍 ...

    Java多线程技术精讲

    在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 首先,我们要理解线程的概念。线程是程序执行的最小单元,一个进程中可以包含多个线程,它们共享进程的资源,但...

    多线程使用操作大全

    ### 多线程使用操作大全 #### 知识点概览 本文主要围绕多线程在Java中的使用展开,深入探讨了线程控制的基本方法及其应用场景,并提供了具体的示例代码来帮助理解。主要包括线程的生命状态检查、优先级管理、线程间...

    一个简单的多线程例子,启动线程与终止线程。

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在服务器端开发和高并发场景中。本示例提供了一个简单的多线程应用,旨在帮助...在深入学习多线程时,还要关注线程安全、性能优化以及异常处理等方面的知识。

    面试中多线程问题

    "面试中多线程问题" 多线程是 Java 编程中一个重要的概念,掌握多线程可以帮助开发者更好地编写高效、稳定的程序。以下是面试中常见的多线程问题和解释: 1. 实现多线程的几种方法? Java 中有两种方式可以实现多...

    多线程资源共享集合

    在编程领域,多线程资源共享是并发编程中的一个重要主题,特别是在Java等支持多线程的编程语言中。本文将深入探讨多线程环境下如何管理和控制资源共享,主要关注`synchronized`关键字、`Runnable`接口以及`Thread`类...

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法、yield()方法、join方法、interrupt()方法

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...

    JAVA(坦克大战,多线程管理).rar

    8. **调试与性能分析** - 使用Java的`ThreadMXBean`监控线程状态,`VisualVM`或`JProfiler`工具进行性能分析,找出瓶颈并优化。 9. **并发设计模式** - 生产者消费者模式、读写锁、双检锁等并发设计模式在游戏...

    java中的多线程实例详解(自己去运行看结果)

    Java中的多线程是编程领域中的重要概念,尤其在服务器端和高性能应用中不可或缺。它允许程序同时执行多个任务,从而提高系统效率和响应性。本文将深入探讨Java多线程的实例,帮助读者理解其工作原理和实际应用。 ...

    浅谈Java线程Thread之interrupt中断解析

    Java线程Thread之interrupt中断机制是Java多线程编程中的一种重要机制。通过调用Thread.interrupt()方法,可以设置线程的中断状态位,线程会不时地检测这个中断标示位,以判断线程是否应该被中断。interrupt机制并...

    java多线程基础资料

    Java多线程是Java编程中的一个...以上只是Java多线程基础知识的一部分,深入学习还包括线程池的配置与优化、线程安全的设计模式、并发工具类的使用等。理解和掌握这些知识点对于编写高效、稳定的多线程程序至关重要。

    java多线程总结

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关知识点,包括线程的创建、线程的状态、同步机制以及线程安全问题。 1. **线程的创建*...

    多线程编程实战指南-核心篇

    总之,《多线程编程实战指南-核心篇》是一本全面解析Java多线程编程的书籍,通过学习,开发者不仅可以掌握多线程编程的基本原理,还能学会如何在实际项目中应用这些知识,提升程序的并发性能和稳定性。对于有一定...

    Java多线程详解与多线程实例

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。多线程使得程序能够并发处理多个任务,例如在一个程序中同时进行数据处理、用户界面更新和网络通信。 在...

    多线程详解(通俗易懂)

    本文将深入浅出地解析多线程的概念、实现方式以及相关的管理与同步策略。 首先,多线程是指在一个应用程序中同时运行多个线程,这使得程序能够并行处理不同的任务,提高系统的效率和响应速度。在Java中,线程是通过...

    [Java基础]猜测Java的interrupt和sleep做了什么

    总结来说,`interrupt()` 和 `sleep()` 在Java多线程编程中扮演着至关重要的角色。它们提供了对线程的灵活控制,使得开发者可以实现复杂的并发策略。同时,理解并正确使用这些方法,有助于避免线程阻塞和资源浪费,...

    java_Thread.rar_java 多线程_java多线程

    总之,Java多线程是Java程序员必须掌握的核心技能之一,它涉及到程序的并发性、性能优化以及资源管理等多个方面。通过"java_Thread.txt"这样的实例学习,可以帮助我们更好地理解和应用Java的多线程特性,提升我们的...

Global site tag (gtag.js) - Google Analytics