`
C_J
  • 浏览: 128128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程设计模式

阅读更多

 

多线程设计模式有很多模式,我用简约的几行伪代码表示吧,如下:

 

模式1:简单的synchronized+wait/notify

最简单的wait/notify的应用,get的时候,如果没有数据就锁住对象,使当前线程等待,当有数据put的时候,调用notify来唤醒等待的线程,释放对象。如下:

private queue;

public synchronized Object get(){
   while(queue.size<=0){wait()}
    return queue.remove();
}
public synchronized void put(Object obj){
    queue.put(obj);
    notifyAll();
}

 

模式2synchronized+return

模式2不同于模式1,是get的时候直接返回,线程不等待。如下:

private queue;

public synchronized Object get(){
    return queue.size<=0? null :queue.remove();
}
public synchronized void put(Object obj){
    queue.put(obj); 
}

 

 

 

模式3:synchronized+wait/notify+buffer

模式3是对模式1的优化,增加了一个“缓存”,当put的时候超过大小需要wait,防止无限制的put操作而导致溢出。

private queue;
private count=0;
private bufferSize=10;
public synchronized Object get(){
   while(count<=0)wait();
   count--;
   return queue.remove();
}
public synchronized void put(Object obj){
    while(count>=bufferSize) wait();
    count++;
    queue.put(obj);
    notifyAll();
}

 

 

模式4:读写锁

 

 

模式5:new工作线程

  模式5是在前几个模式的基础上新增加了工作任务线程,当有新请求过来的时候就新建工作线程,如下handle方法:

private queue;
private count=0;
private bufferSize=10;
private synchronized Object get(){
   while(count<=0)wait();
   count--;
   return queue.remove();
}
public synchronized void put(Object obj){
    while(count>=bufferSize) wait();
    count++;
    queue.put(obj);
    notifyAll();
}

public void handle(){
  new Thread(this.get()){ public void run(){
      System.out.println("Do work..");}}.start();
}

 

模式6:用线程池来优化工作线程

 模式5的坏处是每次一个新的工作,需要new一个新的线程来做,这样开销太大,于是引入的“线程池”,如下:

private queue;
private count=0;
private bufferSize=10;
private final max_wk=20;
private final WorkerThread[] pool=new  WorkerThread[max_wk];


private synchronized Object get(){
   while(count<=0)wait();
   count--;
   return queue.remove();
}
public synchronized void put(Object obj){
    while(count>=bufferSize) wait();
    count++;
    queue.put(obj);
    notifyAll();
}

public void startWrok(){
     for(int i=0;i<pool.size;++i){
       pool[i]=new WorkerThread(this);
       pool[i].start();
   }
}

class WorkerThread extends Thread{
  private Channel channel;
   WorkerThread (Channel channel)
  {
     this.channel=channel;
  }
  public void run()
   {
    while(true){
      Object obj=channel.get();
      obj.doWork();
     }
   }
}

 

模式7:终止线程

 工作线程在做工作的时候先判断是否需要终止线程。

 

public void stopWork(){
    stopWork=true;
    interrupt();
}

public void run(){
  try{
     while(!stopWork){
     do something...
     }
   }catch( InterruptedException e){
    }
}

模式8:ThreadLocal模式 

 目前很多frame比较经典的保持线程安全的模式,他像一个保险箱一样保管着所有线程对象,他需要做点额外的工作,比如把线程对象set()和get()。

 

 

class RealWork
{
   public void doSomething(){// 工作
   ...
   }
}

class Work
{
   private static final ThreadLocal local=new ThreadLocal();
  public void doSomething(){
       getReal().doSomething();
   }
   private void getReal(){ // 获取所处当前线程的资源
    RealWork obj=local.get();
    if(obj==null){
       obj=new RealWork(Thread.currentThread().getName());
       local.set(obj);
     }
    return obj;
  }
}
   

 

 

 

附录:

transient Thread owner;



 public boolean put(E o) {
        if (o == null) throw new NullPointerException();
        final AtomicInteger count = this.count;// 大小计数器
        if (count.get() == capacity)
            return false;
        int c = -1;

        if (compareAndSetState(0, 1))// 检测当前状态,如果没有线程写,那么保存当前线程
                owner = Thread.currentThread();
        else
                acquire(1);// 否则,等待正在写入的线程

        try {
            if (count.get() < capacity) {
                insert(o);
                c = count.getAndIncrement();
                if (c + 1 < capacity)
                    notFull.signal(); // 
            }
        } finally {
            if (tryRelease(1)) {
            Node h = head; // 等待线程链表
            if (h != null && h.waitStatus != 0) 
                unparkSuccessor(h);
          
        }
        }
        if (c == 0)
            signalNotEmpty();
        return c >= 0; // 精炼的写法
    }

 

 

5.0 以前,锁定的功能是由 Synchronized 关键字来实现的,这样做存在几个问题:

 

  • 每次只能对一个对象进行锁定。若需要锁定多个对象,编程就比较麻烦,一不小心就会出现死锁现象。
  • 如果线程因拿不到锁定而进入等待状况,是没有办法将其打断的

 

ReentrantLock锁等待线程队列:

 

获得当前等待取锁线程:

 public final Collection<Thread> getQueuedThreads() {
        ArrayList<Thread> list = new ArrayList<Thread>();
        for (Node p = tail; p != null; p = p.prev) {
            Thread t = p.thread;
            if (t != null)
                list.add(t);
        }
        return list;
    }

 

 

附录:

    关于Daemon线程:

    我是在偶然之间用到的Daemon线程,当时却没有发现什么特别之处,直到今天才意识到微妙且严重的差别,如下:

Any Java thread can be a daemon thread. Daemon threads are service providers for other threads running in the same process as the daemon thread. The run() method for a daemon thread is typically an infinite loop that waits for a service request.
When the only remaining threads in a process are daemon threads, the interpreter exits. This makes sense because when only daemon threads remain, there is no other thread for which a daemon thread can provide a service.
做过实验才明白,原来当只存在Daemon线程且没有用户线程的时候,JVM退出,以前写thread的时候还真没注意,实验如下:

 

public class DaemonThread extends Thread{   
  
    public void  run(){   
        while(true){   
        System.out.println("I'm daemon");   
        }   
    }   
    public static void main(String args[]){   
        DaemonThread daemon=new DaemonThread();   
        daemon.setDaemon(true);   
        daemon.start();   
    }   
}  

 

 

可以看到JVM很快就退出了,虽然这里是一个while(true)循环。

 

分享到:
评论

相关推荐

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...

    Java多线程设计模式源代码

    Java多线程设计模式是Java编程中至关重要的一个领域,它涉及到如何在并发环境中高效、稳定地执行多个任务。在Java中,多线程可以提高应用程序的响应速度和整体性能,尤其是在处理I/O密集型或计算密集型任务时。本...

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程设计模式源码

    Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...

    java多线程设计模式详解(PDF及源码)

    《Java多线程设计模式详解》是一本深入探讨Java并发编程和设计模式的专业书籍,它涵盖了多线程环境下的各种核心概念、最佳实践以及常见问题的解决方案。这本书旨在帮助开发者在实际开发过程中更好地理解和应用多线程...

    JAVA多线程设计模式.pdf 下载

    标题和描述均指向了一个关于Java多线程设计模式的PDF文档的下载链接,这暗示了文档的主要内容将围绕Java中的多线程编程及其设计模式展开。在Java领域,多线程是一个核心概念,它允许程序执行多个任务同时进行,极大...

    java多线程设计模式详解.pdf

    标题“java多线程设计模式详解.pdf”中提到的知识点是关于Java多线程编程中设计模式的应用。Java多线程是并发编程的重要组成部分,设计模式则是软件工程中用于解决特定问题的最佳实践。将两者结合起来,意味着此文件...

    java多线程设计模式.pdf

    java多线程设计模式.pdf java多线程设计模式.pd

    java多线程设计模式详解(PDF及源码).zip

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何高效、安全地利用系统资源进行并发处理。在这个主题中,我们将深入探讨单线程、生产者与消费者模型以及Java中实现多线程的各种方法。 首先,单线程是程序...

    java多线程设计模式详解(pdf版)

    java多线程设计模式,作者是:结城 浩,由 博硕文化 译。2005年4月,由中国铁道出版社出版。内附带部分源代码。

    JAVA多线程设计模式_中国铁道出版社_源码

    JAVA多线程设计模式_中国铁道出版社 本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

    JAVA多线程设计模式(带完整书签清晰扫描版)

    《JAVA多线程设计模式》中包含JAVA线程的介绍导读,12个重要的线程设计模式和全书总结以及丰富的附录内容。每一章相关线程设计模式的介绍,都举一反三使读者学习更有效率。最后附上练习问题,让读者可以温故而知新,...

    java多线程设计模式

    ### Java多线程设计模式详解 #### 一、Java多线程基础 Java语言自诞生以来,便内置了对多线程的支持。多线程可以让应用程序在同一时间处理多个任务,提高程序的执行效率和响应速度。Java中创建线程有两种基本方式...

    Java多线程设计模式(带源码)

    Java多线程设计模式是Java开发中的重要领域,它涉及到并发编程、系统性能优化以及程序的稳定性。在Java中,多线程允许程序同时执行多个任务,极大地提升了程序的执行效率。本资源提供了详细的Java多线程设计模式的...

Global site tag (gtag.js) - Google Analytics