• 生产者,消费者
    • 线程间的通信模型
  • 等待和通知

    • 在生产者和消费者模型中
    • 消费者暂停等待数据
    • 生产者产生数据后发出通知
    • object 方法
      • wait();
      • notify(); 通知一个
      • notifyAll();通知全部
    • 调用 stack.wait();
      • 当前线程,在stack 对象上等待
    • 调用 stack.notifyAll();
      • 在 stack 上发出通知,通知在 stack 对象上等待的线程
    • 注意:
      • 必须在 synchronized 同步代码快中调用
      • 必须在加锁的对象上等待或通知
      • synchronized (a) { a.wait(); a.notifyAll(); }
      • 为了保证安全, wait()外面总应该是一个循环判断 while
    • package day1802_生产者消费者;
      
      import java.util.Random;
      
      public class Producer extends Thread{
      private Stack stack; public Producer(Stack stack) {
      super();
      this.stack = stack;
      } @Override
      public void run() {
      super.run();
      while (true) {
      char c = (char)('a' + new Random().nextInt());
      synchronized (stack) { while (stack.isFull()) {
      try {
      stack.wait();
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      } stack.push(c);
      System.out.println("压入>>"+c); stack.notifyAll();
      } } } }
      package day1802_生产者消费者;
      
      public class Consumer extends Thread{
      private Stack stack; public Consumer(Stack stack) {
      super();
      this.stack = stack;
      } @Override
      public void run() {
      // TODO Auto-generated method stub
      super.run(); while (true) {
      synchronized (stack) {
      while (stack.isEmpty()) {
      try {
      stack.wait();
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      } char c = this.stack.pop();
      System.out.println("弹出>>"+c); stack.notifyAll();
      } }
      } }
      package day1802_生产者消费者;
      
      public class Stack {
      
          private char[] a = new char[];
      private int index; public void push(char c) {
      if (isFull()) {
      return;
      } a[index] = c;
      index++;
      } public char pop() {
      if (isEmpty()) {
      return ' ';
      }
      index--;
      return a[index];
      } public boolean isEmpty() {
      // TODO Auto-generated method stub
      return index==;
      } public boolean isFull() {
      // TODO Auto-generated method stub
      return index==;
      } }
      package day1802_生产者消费者;
      
      import com.sun.swing.internal.plaf.synth.resources.synth;
      
      public class Test1 {
      public static void main(String[] args) {
      Stack stack = new Stack();
      Producer producer = new Producer(stack);
      Consumer consumer = new Consumer(stack); producer.start();
      consumer.start(); // main 线程 死循环发通知
      while (true) {
      synchronized (stack) {
      stack.notifyAll();
      }
      }
      } }
  • 线程监视器模型
    • 遇到 synchronized 关键字 ,在加锁的对象会关联一个同步监视器
  • 网络通信
    • window 终端输入 ipconfig
    • mac 终端输入 ifconfig
    • ping  192.168.4.xxx,  ping 不通, 关闭防火墙
  • Socket 网络通信
    • socket 网络套接字 (插头)
    • 主机之间, 需要能用 IP地址,找到对方
    • 在主机上选择一个端口, 来插插头(socket)
    • 端口有 0 到 65535 个 端口
  • 服务器端
    • 被动的等待客户端发起连接
    • 在一个端口上启动服务
  • 客户端
    • 向指定的服务器的 IP地址和端口号 发起连接,建立连接通道
    • 连接通道的两端, 都有一个插头
  • ServerSocket
    • 启动服务
    • ServerSocket ss = new ServerSocket(8000);
    • 端口必须独占
    • 0-1024,是常见服务的默认端口
    • 50000之后是,是系统的保留端口来动态分配
    • 方法
      • accept()
        • 暂停,等待客户端发起连接
        • 建立与客户端的链接通道,并返回通道的服务器插头对象
      • close()
        • 停止服务, 释放端口
    • 网络通信的阻塞操作
      • ss.accept();// 阻塞暂停等待
      • in.read();   // 阻塞,接收数据,对方不发送,死等
  • 服务器端的线程模型

java - day018 - 线程续的更多相关文章

  1. Java调度线程池ScheduleExecutorService(续)

    链接 Java线程池详解(一) Java线程池详解(二) Java调度线程池ScheduleExecutorService 上面列出了最近写的关于java线程池ScheduleExecutorServ ...

  2. java之线程

    java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...

  3. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

  4. Java的线程安全

    线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...

  5. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  6. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  7. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  8. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  9. Java的线程模型

    并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...

随机推荐

  1. Flink FileSink 自定义输出路径——StreamingFileSink、BucketingSink 和 StreamingFileSink简单比较

    接上篇:Flink FileSink 自定义输出路径——BucketingSink 上篇使用BucketingSink 实现了自定义输出路径,现在来看看 StreamingFileSink( 据说是S ...

  2. netty WEBSOKET 客户端 JAVA

    https://blog.csdn.net/mafei6827/article/details/80657405 https://blog.csdn.net/u010939285/article/de ...

  3. TS - 问题解决力 - 下篇

    本文是已读书籍的内容摘要,少部分有轻微改动,但不影响原文表达. <麦肯锡工作法 - 个人竞争力提升50%的7堂课> ISBN: 9787508644691 https://book.dou ...

  4. vs2015.无法运行rc.exe

    1.参考文章:无法运行“rc.exe” - wb175208的专栏 - CSDN博客.html(https://blog.csdn.net/wb175208/article/details/83546 ...

  5. C罗是你人生中最好的健身教练和精神导师

    C罗又进球了,两场小组赛包揽全队4粒进球,一己之力帮助葡萄牙取得1胜1平,掌握出线主动权.此前三届世界杯金靴分别只有6球.5球.5球进账,C罗如果能延续火爆状态,金靴唾手可得. 之前三届世界杯,C罗7 ...

  6. 封装transform函数(设置和获取transform的属性和属性值)

    (function (w) { /** * 设置或者获取元素的transform属性值 * @param node 要设置的元素 * @param param 变换属性: translate\scal ...

  7. UMl类图基本认识

    1.基本认识 1) UML——Unified modeling language UML (统一建模语言), 是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果2) ...

  8. windows强大的快捷键

    1 电脑锁屏 有些时候,需要暂时离开座位去处理其他事,可是电脑还有数据再跑. 关掉的话,数据就白跑了,不关的话,又不想让别人看到我电脑的资料. 那么就按住windows键后,再按L键. 这样电脑就直接 ...

  9. poj 1852&3684 题解

    poj 1852 3684 这两题思路相似就放在一起. 1852 题意 一块长为L长度单位的板子(从0开始)上有很多只蚂蚁,给出它们的位置,它们的方向不确定,速度为每秒一长度单位,当两只蚂蚁相遇的时候 ...

  10. Python30之文件2(文件系统)

    一.在python中对于文件系统的访问一般使用的是os模块.python是跨平台的,因此在使用os模块时,不需要关心是在什么系统下使用的 import os >>> os.listd ...