package com.sunrise.mywork2.concurrent.queue;
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class IndexingService
{
private static final int CAPACITY = 1000;
private static final File POISON = new File("");
private final IndexerThread consumer = new IndexerThread();
private final CrawlerThread producer = new CrawlerThread();
private final BlockingQueue<File> queue;
private final FileFilter fileFilter;
private final File root;
public IndexingService(File root,final FileFilter fileFilter){
this.root = root;
this.queue = new LinkedBlockingQueue<File>(CAPACITY);
this.fileFilter = new FileFilter()
{
public boolean accept(File pathname)
{
return pathname.isDirectory()||fileFilter.accept(pathname);
}
};
}
private boolean alreadyIndexed(File f){
return false;
}
class CrawlerThread extends Thread{
public void run(){
try{
crawl(root);
}catch (InterruptedException e) {
}finally{
while(true){
try{
queue.put(POISON);
break;
}catch (InterruptedException e1) {
}
}
}
}
private void crawl(File root) throws InterruptedException{
File[] entries = root.listFiles(fileFilter);
if(entries!=null){
for(File entry:entries){
if(entry.isDirectory())
crawl(entry);
else if(!alreadyIndexed(entry))
queue.put(entry);
}
}
}
}
class IndexerThread extends Thread{
public void run(){
try{
while(true){
File file = queue.take();
if(file == POISON)
break;
else
indexFile(file);
}
}catch (InterruptedException e) {
}
}
public void indexFile(File file){
//TODO
System.out.println(file.getName());
}
}
public void start(){
producer.start();
consumer.start();
}
public void stop(){
producer.interrupt();
}
public void awaitTermination() throws InterruptedException{
consumer.join();
}
/**
* test it
* @param args
*/
public static void main(String[] args)
{
File root = new File("F:\\");
FileFilter fileFilter = new FileFilter()
{
public boolean accept(File f)
{
return f.getName().lastIndexOf(".java")>-1;
}
};
IndexingService is = new IndexingService(root, fileFilter);
is.start();
}
}
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class IndexingService
{
private static final int CAPACITY = 1000;
private static final File POISON = new File("");
private final IndexerThread consumer = new IndexerThread();
private final CrawlerThread producer = new CrawlerThread();
private final BlockingQueue<File> queue;
private final FileFilter fileFilter;
private final File root;
public IndexingService(File root,final FileFilter fileFilter){
this.root = root;
this.queue = new LinkedBlockingQueue<File>(CAPACITY);
this.fileFilter = new FileFilter()
{
public boolean accept(File pathname)
{
return pathname.isDirectory()||fileFilter.accept(pathname);
}
};
}
private boolean alreadyIndexed(File f){
return false;
}
class CrawlerThread extends Thread{
public void run(){
try{
crawl(root);
}catch (InterruptedException e) {
}finally{
while(true){
try{
queue.put(POISON);
break;
}catch (InterruptedException e1) {
}
}
}
}
private void crawl(File root) throws InterruptedException{
File[] entries = root.listFiles(fileFilter);
if(entries!=null){
for(File entry:entries){
if(entry.isDirectory())
crawl(entry);
else if(!alreadyIndexed(entry))
queue.put(entry);
}
}
}
}
class IndexerThread extends Thread{
public void run(){
try{
while(true){
File file = queue.take();
if(file == POISON)
break;
else
indexFile(file);
}
}catch (InterruptedException e) {
}
}
public void indexFile(File file){
//TODO
System.out.println(file.getName());
}
}
public void start(){
producer.start();
consumer.start();
}
public void stop(){
producer.interrupt();
}
public void awaitTermination() throws InterruptedException{
consumer.join();
}
/**
* test it
* @param args
*/
public static void main(String[] args)
{
File root = new File("F:\\");
FileFilter fileFilter = new FileFilter()
{
public boolean accept(File f)
{
return f.getName().lastIndexOf(".java")>-1;
}
};
IndexingService is = new IndexingService(root, fileFilter);
is.start();
}
}
相关推荐
Java多线程BlockingQueue实现生产者消费者模型详解 Java多线程中,生产者消费者模型是非常重要的一种设计模式,它可以解决多线程之间的数据传输问题。在Java中,我们可以使用BlockingQueue来实现生产者消费者模型,...
BlockingQueue的应用场景非常广泛,如在多线程应用中,用于实现生产者消费者模式、消息队列、缓存等。在实际项目中,可以根据需要选取适合的BlockingQueue实现和处理方法。 通过 BlockingQueue,可以实现以下几个...
在Java中,`java.util.concurrent`包下的`BlockingQueue`接口提供了一种线程安全的数据结构,非常适合用于实现生产者消费者模式。生产者将产品放入队列,消费者从队列中取出产品。`BlockingQueue`提供了`put()`和`...
创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....
在Java中,我们可以通过`java.util.concurrent`包中的`BlockingQueue`来实现生产者消费者模式。`BlockingQueue`是一个线程安全的数据结构,它提供了一种在生产者和消费者之间同步的方法,当队列满时,生产者会被阻塞...
在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...
在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...
通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。
源码:BlockingQueue实现生产者消费者模式→ 输出结果截图 1. Queue接口 – 队列 public interface Queue extends Collection Collection的子接口,表示队列FIFO(First In First Out) 常用方法: (1)抛出异常...
在Java中实现生产者消费者模式,主要依赖于Java提供的并发工具类,如`BlockingQueue`接口以及其实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。这些队列具有线程安全的特性,能够有效地避免数据竞争和...
通过对这个代码的分析和学习,我们可以更深入地理解多线程同步以及生产者消费者模式在实际应用中的实现方法。 总之,生产者消费者问题是多线程编程中的一个重要概念,它展示了如何通过同步机制来协调不同任务之间的...
- **阻塞队列(BlockingQueue)**:Java中的`BlockingQueue`接口用于实现生产者消费者模式的关键组件。它提供了一种线程安全的数据交换方式,当队列满时,生产者会被阻塞,直到消费者取走数据;反之,当队列空时,...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`...理解并掌握生产者与消费者模式有助于编写高效、可靠的多线程应用程序。
在实现生产者/消费者模式时,通常会用到同步机制,如锁或者信号量,以保证生产者不会在缓冲区满时继续添加数据,消费者也不会在缓冲区空时尝试消费数据。在Java中,可以使用`java.util.concurrent`包中的`...
在实际使用中,生产者-消费者模式可以通过`BlockingQueue`来简化实现。`BlockingQueue`是一个线程安全的数据结构,它提供了在满时阻塞生产者、空时阻塞消费者的能力,这样可以避免无谓的资源浪费,同时简化同步代码...
在Java中,生产者消费者问题的实现通常涉及`BlockingQueue`接口,如`ArrayBlockingQueue`。生产者线程使用`put()`方法添加元素到队列,若队列已满则会被阻塞;消费者线程使用`take()`方法获取并移除元素,若队列为空...
本项目以"多线程实现生产者消费者"为主题,通过五个核心类:consumer(消费者)、producer(生产者)、product(产品)、storage(仓库)以及producerandconsumer(生产者消费者主类)来展示这一模型的应用。...
在"阻塞队列实现生产者消费者模式Java开发Java经验技巧共4页.pdf.zip"这个压缩包中,很可能是详细介绍了如何使用Java的阻塞队列来构建生产者消费者模式,可能包括以下知识点: 1. **阻塞队列接口**:首先,会介绍`...
在Java中,`BlockingQueue`接口是实现生产者消费者模式的理想选择。`BlockingQueue`提供了线程安全的队列操作,并且内置了阻塞机制。当队列满时,`put()`方法会使得生产者线程自动阻塞,直至队列有空位;当队列空时...
在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...