`
RobustTm
  • 浏览: 23936 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java定时扫描线程

阅读更多
public class Task{
      private int taskId;
      private String taskName;
      private char state;
      // get set
}

 

package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.task.manager.Task;

public class ThreadPool {
	private List<Task> list;
	public List<Task> getList() {
		return list;
	}
	public void setList(List<Task> list) {
		this.list = list;
	}

	private LinkedBlockingQueue<Task> taskList = new LinkedBlockingQueue<Task>();
	
	ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
	ExecutorService threadPool = Executors.newFixedThreadPool(1);
	
	private Runnable workTask = new Runnable() {
		public void run() {
			while(!taskList.isEmpty()){
				Task task = getTask();
				System.out.println("获得任务:"+task.getTaskName());
				list.remove(task);
				task.setState('1');
				list.add(task);
			}
		}
	};

	public void excute(Runnable run){
		threadPool.execute(run);
	}
	public Task getTask() {
		if(taskList.isEmpty()){
			System.out.println("任务队列为空!");
		}
		try{
			return (Task)taskList.take();
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		return null;
	}
	public void setTask(List<Task> l){
		if(l!=null&&l.size()>0){
			for(int i=0;i<l.size();i++){
				Task t = l.get(i);
				System.out.println("增加任务:"+t.getTaskId());
				addTask(t);
			}
			excute(workTask);
		}
	}
	private synchronized void addTask(Task t) {
		if(!taskList.contains(t)){
			taskList.offer(t);
		}
	}

	public void scheduleTask(){
		scheduler.scheduleAtFixedRate(new Runnable(){
			public void run() {
				System.out.println("扫描任务");
				List<Task> temp = getAllTaskByState('0');
				setTask(temp);
			}	
		},5,5,TimeUnit.SECONDS);
	}
	
	public void createTask(){
		scheduler.scheduleAtFixedRate(new Runnable(){
			public void run() {
				System.out.println("定时添加任务");
				Task t = new Task();
				int id = 0;
				synchronized(list){
					if(list!=null && list.size()>0){
						id = list.size()+1;
					}
					t.setTaskId(id);
					t.setState('0');
					t.setTaskName("任务"+id);
					list.add(t);
				}
			}	
		},4,4,TimeUnit.SECONDS);
	}
	public List<Task> getAllTaskByState(char state){
		List<Task> temp = new ArrayList<Task>();
		synchronized(list){
			for(int i = 0;i < list.size();i++){
				Task t = list.get(i);
				if(t.getState() == '0'){
					temp.add(t);
				}
			}
		}
		return temp;
	}
	
	public static void main(String[] args){
		List<Task> tempList = new ArrayList<Task>();
		for(int i=0;i<20;i++){
			Task tempTask = new Task();
			tempTask.setTaskId(i);
			tempTask.setTaskName("任务"+i);
			tempTask.setState('0');
			tempList.add(tempTask);
		}
		ThreadPool taskManager = new ThreadPool();
		taskManager.setList(tempList);
		taskManager.scheduleTask();
		taskManager.createTask();
	}
}

 

 

 本人对Java线程的研究不多,很想弄懂线程相关知识,下面是本人的一个例子,还望大家指导如何学习好线程,如若有牛人提供资料,本人表示感谢

还望大家指正

分享到:
评论

相关推荐

    JAVA 线程实现数据库的主从同步更新

    这可以通过定时任务实现,例如使用Java的`java.util.Timer`或`ScheduledExecutorService`。在每次同步时,从数据库线程获取主数据库的增量变更,然后通过批量更新或者SQL语句复制到从数据库。这里也要注意线程安全,...

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    文件内容并不完整,且存在 OCR 扫描错误,但我会尝试从中提取与Java多线程和内存管理相关的知识点,并加以详细解释。 ### Java多线程运行时的内存管理 在Java中,多线程是实现并行计算的核心机制之一,而内存管理...

    多线程雷达扫描界面

    主线程负责UI的更新和用户交互,而雷达扫描线程则负责计算和绘制雷达扫描效果。这样可以确保即使在进行复杂计算时,用户界面仍然保持流畅和响应。 1. **线程创建与管理**:在Java中,可以使用`Thread`类直接创建...

    java多线程实验报告.pdf

    根据提供的文件信息,我们可以提炼出一系列与Java多线程相关的知识点,这些知识点是实验报告中所涵盖的,尽管提供的内容存在一些OCR扫描错误和遗漏,但仍然可以总结出主要的知识点。 Java多线程知识点包括: 1. ...

    用电脑摄像头扫描二维码

    综上所述,实现“用电脑摄像头扫描二维码”的Java小程序涉及到图像处理、二维码解码、摄像头访问、事件处理和多线程等多个方面的知识。通过掌握这些技术,我们可以开发出高效、易用的二维码扫描工具,进一步拓展电脑...

    定时任务+缓存+极光消息推送+多线程处理+单表查询优化

    Java的ExecutorService和Thread Pool提供了强大的多线程管理工具。 5. **单表查询优化**:对于大数据量的单表查询,优化显得尤为重要。优化策略包括:创建合适的索引,减少全表扫描;合理设计数据库字段,避免冗余...

    某电信项目多线程同步数据实例

    在提供的"ScanThread"文件名中,我们可以推测这是一个扫描线程的实现,可能是用来定时或按需扫描数据源,然后触发数据同步的过程。可能包含了线程启动、同步机制、数据处理逻辑等内容。 综上所述,这个电信项目实例...

    消息队列延迟定时任务

    接下来,我们需要一个后台线程或者定时任务来不断检查是否有到期的任务需要执行。这通常通过遍历有序集合并比较当前时间与每个任务的分数(时间戳)来实现。当分数小于等于当前时间时,说明任务已经到期,可以执行:...

    海康威视SDK自动拍照java代码(亲测有效))

    本文将深入解析使用Java编程语言,结合海康威视SDK实现自动拍照的原理和过程。 首先,我们需要了解Java SDK的基本结构和使用方法。海康威视提供的SDK通常包含一系列的接口类和示例代码,这些接口定义了与设备通信的...

    第14章多线程.pdf

    8. Ticker线程:文档中出现了Ticker这个词,可能是指一种周期性的线程,类似于时钟的滴答声,用于定时任务或周期性执行某些操作。 9. Web应用中的applet:文档中提到了Web applet,它是一种小程序,可以在支持Java...

    Java目录监视器源程序

    Java目录监视器是一个基于Java编程语言实现的小型实用工具,其主要功能是实时监控指定的文件目录,并在每次扫描间隔(如5秒)后报告目录内文件大小的变化以及文件数量的增减。这个应用程序对于开发者来说非常有用,...

    java编写的飞鸽传书程序,实现了局域网间的文件传输功能.zip

    在实现文件传输的过程中,Java程序可能会使用多线程来提高效率,一个线程负责监听和接收文件,另一个线程处理用户的交互界面,确保在传输过程中用户可以继续操作其他功能。为了保证文件传输的完整性,程序可能采用了...

    java之JUC系列.pdf

    需要注意的是,由于内容里存在OCR扫描识别错误,以上知识点是基于对可识别内容的理解整理而成,可能并不完全准确,但提供了JUC中关键组件的功能及其应用场景,方便读者了解和掌握Java并发编程的高级特性。

    灯光扫描的效果

    在这个场景中,我们关注的是如何使用Java的Applet和Runnable多线程技术来创建这种效果。让我们深入探讨这个话题。 首先,`Applet`是Java提供的一种用于在Web浏览器中运行的小程序。它允许开发者创建交互式的网页...

    PortScanner:使用SwingUI用Java编写的端口扫描程序

    【端口扫描器:使用SwingUI的Java实现】 端口扫描是网络安全和系统管理员常用的一种工具,用于探测网络上...在实际项目中,还可以考虑增加更多功能,如自定义扫描范围、保存扫描结果、定时扫描等,以满足不同需求。

    Batch Engine 源码

    本项目提供的"Batch Engine源码"是用Java语言实现的一个批处理框架,它利用Swing和线程技术来实现定时扫描和执行批处理任务的功能。以下将详细介绍其中涉及的关键知识点: 1. **Java Swing**: Java Swing是Java GUI...

    自动扫描下载解析

    整个系统旨在实现定时扫描远程FTP服务器上的文件,并根据预定规则自动下载这些文件到本地,再进一步处理。 #### 二、系统架构与功能模块 **1. Main.java** - **启动三个线程**:`Main.java`类作为整个系统的入口,...

    基于java swing 开发的线下支付宝扫码实时订单监控客户端源码

    通过定时扫描支付宝商家账户的详细页面,它能够抓取接口返回的数据,并对这些数据进行解析,最终将订单信息清晰地显示在系统列表中。 首先,要理解这个项目的运行机制,我们需要关注以下几个关键点: 1. **定时...

    java.util.concurrent.uml.pdf

    标签“Java concurrent”是指这是一个关于Java并发编程的内容,这通常是面向希望开发多线程应用程序的Java开发者。并发编程允许程序同时处理多个任务,这对于多核心处理器和多处理器系统尤其重要。 文档的一部分...

Global site tag (gtag.js) - Google Analytics