`

线程阻塞

阅读更多

线程阻塞队列

文章分类:Java编程

摘自别人,仅供分析
Java代码 复制代码 收藏代码
  1.   
  2. /*  
  3. 编写一个线程安全、大小固定的队列  
  4. 提供阻塞式的方法put,若队列没有空间,则方法put会一直等待  
  5. 提供阻塞式的方法take,若队列为空,则方法take会一直等待  
  6. 启动30个线程操作该队列,每个线程进行一次put和一次take操作    
  7. */  
  8.   
  9. /*  
  10. 已经按照顺序获得读锁和写锁了,但是如果启动30个线程的话,基本上每次都会死锁,线程都停在read_lock.wait()的位置,  
  11. 如果启动20个线程就只有一半的几率会死锁(其实都在等待read_lock的锁,不能说是死锁),但每一个线程take一次必然会put一次,  
  12. 或者反过来,按说是不会有都等待read_lock的情况  
  13. */  
  14.   
  15. package com.huawei.test;   
  16.   
  17. import java.util.*;   
  18.   
  19. public class Queue1   
  20. {   
  21.    final int SIZE = 10//队列固定大小   
  22.    ArrayList store = new ArrayList(SIZE);   
  23.   
  24.    Object write_lock = new Object();//用于对store的写操作,如get/add/set/remove   
  25.    Object read_lock = new Object(); //用于对store只读操作,如取size   
  26.   
  27.    public Queue1(){}   
  28.   
  29.    public void put (Object o) //没有空间一直等待   
  30.    {   
  31.        while(true){   
  32.            synchronized(read_lock){   
  33.                try{   
  34.                    if(store.size() == SIZE){   
  35.                        read_lock.wait();//如果队列已满,就释放锁   
  36.                    }else{   
  37.                        synchronized(write_lock){   
  38.                            Thread.sleep(50);   
  39.                            store.add(o); //增加元素到队列   
  40.                            System.out.println(Thread.currentThread().getName() + "****PUT::Size=" + store.size());   
  41.                            Thread.sleep(50);   
  42.                            read_lock.notifyAll(); //通知其他线程   
  43.                            break;   
  44.                          }   
  45.                    }   
  46.                }catch(Exception ex){   
  47.                        ex.printStackTrace(System.err);   
  48.                }   
  49.            }   
  50.        }   
  51.    }   
  52.   
  53.   
  54.    public Object take () //没有数据一直等待   
  55.    {   
  56.        while(true){   
  57.            synchronized(read_lock){   
  58.                try{   
  59.                    if(store.size() == 0){   
  60.                        read_lock.wait();//如果队列没有数据,就释放锁   
  61.                    }else{   
  62.                        synchronized(write_lock){   
  63.                            Thread.sleep(50);   
  64.                            Object obj = store.remove(0); //从队列头移走数据   
  65.                            System.out.println(Thread.currentThread().getName() + "****Take::Size=" + store.size());   
  66.                            Thread.sleep(50);   
  67.                            read_lock.notifyAll();//通知其他线程   
  68.                            return obj;   
  69.                        }   
  70.                    }   
  71.                }catch(Exception ex){   
  72.                    ex.printStackTrace(System.err);   
  73.                }   
  74.            }   
  75.        }   
  76.    }   
  77.   
  78.   
  79.    public static void main(String[] args){   
  80.        Queue1 queue1 = new Queue1(); //创建一个队列   
  81.   
  82.        for(int i = 0; i < 30; i++){ //启动30个线程访问队列   
  83.            TestThread thread = new TestThread(queue1,i);   
  84.            System.out.println( "--Thread:" + i + " Start!" );   
  85.            thread.start();   
  86.            try{   
  87.                Thread.sleep(10); //没隔十毫秒启动一个线程   
  88.            }catch(Exception ex){   
  89.                ex.printStackTrace(System.err);   
  90.            }   
  91.        }   
  92.    }   
  93.   
  94. }   
  95.   
  96.   
  97. class TestThread extends Thread   
  98. {   
  99.    Queue1 queue1 = null;   
  100.    int sn = 0;   
  101.   
  102.    public TestThread(Queue1 queue1,int sn){   
  103.        this.queue1 = queue1;   
  104.        this.sn = sn;   
  105.        setName("Thread::" + sn); //以序号作为线程名   
  106.    }   
  107.   
  108.    public void run(){   
  109.        String tmp = null;   
  110.        try{   
  111.            if( sn < 7){ //sn小于7的线程先put,后take   
  112.                tmp = "Thread-PUT::" + sn + "---put::";   
  113.                queue1.put(tmp);   
  114.                Thread.sleep(10);   
  115.                tmp = "Thread-Take::" + sn + "---take::";   
  116.                Object obj = queue1.take();   
  117.            }else//sn大于7的线程先take,后put   
  118.                tmp = "Thread-Take::" + sn + "---take::";   
  119.                Object obj = queue1.take();   
  120.                Thread.sleep(10);   
  121.                tmp = "Thread-PUT::" + sn + "---put::";   
  122.                queue1.put(tmp);   
  123.            }   
  124.            System.out.println("Thread::" + sn + " task over!");   
  125.        }catch(Exception ex){   
  126.            ex.printStackTrace(System.err);   
  127.        }   
  128.   
  129.    }   
  130. }  
分享到:
评论

相关推荐

    Java Socket学习---单线程阻塞

    "Java Socket学习---单线程阻塞"这个主题主要探讨了如何使用Java的Socket类进行单线程的阻塞式通信,这种模式通常用于简单的客户端-服务器应用。在这个场景中,服务器端通过一个线程处理一个客户端的请求,当请求被...

    多线程阻塞服务器程序(tcp)

    在服务端应用程序的主线程中不停的调用accept操作,以使服务端程序能不停地接受客户端程序发送...详见链接:Winsocket 二:多线程阻塞服务器程序(tcp),http://blog.csdn.net/u013071074/article/details/26340707

    普通的SOCKET多线程阻塞模型

    "普通的SOCKET多线程阻塞模型"是指使用标准的Socket接口,结合多线程技术实现的一种通信模型,它广泛应用于VC(Visual C++)开发环境中。在这一模型中,每个线程负责处理一个连接,当线程在进行读写操作时,如果数据...

    winsock多线程阻塞通信

    本实验“winsock多线程阻塞通信”主要关注如何在多线程环境中使用Winsock进行阻塞式的网络通信,这是一种基础但重要的编程技术,尤其在服务器端编程中广泛应用。 首先,我们要理解什么是阻塞与非阻塞模式。阻塞模式...

    C#多线程不阻塞

    本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步方法调用是传统的调用方式,当一个线程调用一个函数,如`Foo()`,它会等待...

    实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)

    在标题和描述中提到的“实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)”是一个典型的并发编程问题,涉及到线程管理和通信。以下是对这个主题的详细讲解: 1. **线程与并发**: - 线程是程序执行的最小...

    [转载] 多线程阻塞式网络编程socket_源代码

    本文将深入探讨标题和描述中提到的“多线程阻塞式网络编程socket”相关的知识点。 首先,我们需要理解“socket”。Socket是操作系统提供的一个接口,允许应用程序进行网络通信。它就像一个通信端口,通过它可以发送...

    单线程阻塞tcp server&client程序

    本篇将深入探讨“单线程阻塞TCP Server&Client程序”的相关知识点。 首先,我们来理解“单线程”概念。在计算机程序中,线程是程序执行的最小单位,一个进程可以有多个线程。单线程意味着整个程序只有一个执行线程...

    010_android 之UI线程阻塞及其优化

    本视频教程“010_android 之UI线程阻塞及其优化”深入探讨了这一主题,下面是对相关知识点的详细解析。 一、UI线程的重要性 Android系统为了保证用户界面的流畅性,规定所有的UI操作都必须在UI线程中执行。这是因为...

    TCP协议的客户端和服务器端多线程阻塞模式的简单例子

    本示例旨在介绍如何在TCP协议的客户端和服务器端实现多线程阻塞模式,这对于初学者理解网络编程的原理及其应用是非常有价值的。 首先,让我们理解什么是阻塞模式。在TCP编程中,阻塞模式意味着当一个线程调用recv或...

    01_AsyncTask_演示线程阻塞

    这篇我们将深入探讨`AsyncTask`的基本概念和工作原理,以及如何避免线程阻塞。 `AsyncTask`主要包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表任务的输入参数类型、后台执行过程中的进度类型和最终...

    Java Socket学习---多线程阻塞

    本教程主要探讨的是如何在Java中使用Socket实现多线程阻塞式通信,这通常涉及到服务器端(EchoServer)和客户端(EchoClient)的设计。在本文中,我们将详细解析`EchoServer.java`、`SocketUtils.java`和`EchoClient...

    QT-线程阻塞问题-开启多线程(帮助你快速解决因大量计算耗时而导致主线程渲染阻塞的问题、简单实现多线程教学)

    我们经常会进行一些比较复杂的计算和算法实现,或者是在某些特定的情况下会实例化一些类。...可以通过开启子线程,将复杂计算内容交给子线程来处理,主线程主要进行UI的渲染操作,这样同样能够解决线程阻塞的问题。

    读书笔记:C#网络编程与JAVA网络通信。TCP, UDP的Socket编程多线程阻塞非阻塞等。.zip

    读书笔记:C#网络编程与JAVA网络通信。TCP, UDP的Socket编程多线程阻塞非阻塞等。

    线程阻塞优化

    在软件开发中,尤其是涉及到用户界面(UI)的应用程序,线程阻塞是一个常见的性能问题。线程阻塞指的是一个线程在等待某个条件满足或资源释放时,无法继续执行的状态。这通常会导致应用程序响应变慢,甚至出现卡顿、...

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    android 学习笔记5-线程阻塞 UI更新

    1、查看网络上的图片 2、主线程阻塞-ANR 3、刷新UI-Handler 4、在本地缓存图片-例如微信的图片 5、获取开源代码 6、显示一个新闻客户端 7、使用GET方式提交表单数据 8、使用POST方式提交表单

    Jquery ajax 同步阻塞引起的UI线程阻塞问题

    然而,当你设置`async: false`时,`AJAX`请求会变成同步的,这会导致一些潜在的问题,就像你在项目中遇到的UI线程阻塞问题。 同步`AJAX`请求意味着JavaScript引擎会等待该请求完成才会继续执行后续的代码。在这种...

    MFC.rar_MFC事件驱动_MFC多线程阻塞_VC 串口通信_VC API_visual c++ api

    用MFC实现串口编程, 本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC ...并给出用Visual C++6.0 编写的相应MFC32位应用程序。...API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.

    详解Java多线程编程中LockSupport类的线程阻塞用法

    在Java多线程编程中,LockSupport类是一个重要的工具,它提供了一种低级别的线程阻塞和唤醒机制。LockSupport并不像synchronized或java.util.concurrent.locks包中的Lock接口那样提供锁的完整功能,但它提供了两个...

Global site tag (gtag.js) - Google Analytics