请您先登录,才能继续操作

论坛首页 Java企业应用论坛

单线程处理多任务处理方式

浏览 5732 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-27   最后修改:2009-12-30
缘由:
    在实际的应用中可能会出现这样一种尴尬:只有一个工作线程(这里叫单线程吧)处理大量的信息。而这些信息由线程池中的执行线程提供而来,起先想用线程同步的机制来实现,但这样子会出现了一些弊端:线程池中的线程会被卡住,直到这个单线程空闲才可以和这些线程池中的线程同步处理,这有违反当初设计这一线程池的目的。
   
  工作内容:
    1端信息输入
    2端信息输入        提取信息                                           处理结果
    3端信息输入 ———————— 用线程池处理 ———————— 交由单线程处理(只能有一个实例)
    ...
    n端信息输入

于是在单线程里面实现信息缓存机制。

单线程类
MakeWork.java

package work;

import java.util.ArrayList;
import java.util.List;

/**
 * 单线程 1、设置工作内容 2、自我唤醒功能 3、线程关闭
 */
public class MakeWork extends Thread
{
	private boolean shutdown = false;
	// 缓存列表
	private List<String> list = new ArrayList<String>();

	public void setMessage(String message)
	{
		synchronized (this)
		{
			list.add(message);
			notify();
		}
	}

	public void run()
	{
		while (!shutdown)
		{
			synchronized (this)
			{
				while (list.size() > 0)
				{
					String message = list.remove(0);
					System.out.println("message: " + message);
				}
			}
			try
			{
				wait();
			} catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}

	}

	public void close()
	{
		synchronized (this)
		{
			this.shutdown = true;
			this.notify();
		}
	}
}



Work.java
package work;

/**
 * 虚拟线程池线程:将处理后返回的结果提交到单例线程
 */
public class Work
{
	// 单线程对象
	private MakeWork makeWork;

	public Work(MakeWork makeWork)
	{
		this.makeWork = makeWork;
	}

	// 将处理后返回的结果提交到单例线程
	public void work(String message)
	{
		makeWork.setMessage(message);
	}
}


测试类:
Test.java
package test;

import java.util.Random;

import work.MakeWork;
import work.Work;

public class Test
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		MakeWork makeWork = new MakeWork();
		makeWork.start();
// 虚拟1000个线程同时操作
		for (int i = 0; i < 1000; i++)
		{
			Work workThread = new Work(makeWork);
			workThread.work("do: " + i);
		}
	}

}


结果:
message: do: 0
message: do: 1
message: do: 2
message: do: 3
message: do: 4
message: do: 5
    .
    .
    .
    .

   发表时间:2009-12-28  
随便看一眼就错了
        synchronized (this)  
        {  
            synchronized (list)  
            {  
...
}
}

list是private方法,外人访问不到. 必然是通过this来访问. 既然已经synchronized了this,就不用再synchronized(list)了
0 请登录后投票
   发表时间:2009-12-29  
这个有什么意义吗?
0 请登录后投票
   发表时间:2009-12-29  
不明白LZ想表达什么。。。
0 请登录后投票
   发表时间:2009-12-29  
理解不能啊
0 请登录后投票
   发表时间:2009-12-30  
强强爱妍妍 写道
随便看一眼就错了
        synchronized (this)  
        {  
            synchronized (list)  
            {  
...
}
}

list是private方法,外人访问不到. 必然是通过this来访问. 既然已经synchronized了this,就不用再synchronized(list)了


多谢指正
0 请登录后投票
   发表时间:2009-12-31  
太山寨了,这种情况应该用coroutine
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics