java - day018 - 线程续
- 生产者,消费者
- 线程间的通信模型
- 等待和通知
- 在生产者和消费者模型中
- 消费者暂停等待数据
- 生产者产生数据后发出通知
- 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 - 线程续的更多相关文章
- Java调度线程池ScheduleExecutorService(续)
链接 Java线程池详解(一) Java线程池详解(二) Java调度线程池ScheduleExecutorService 上面列出了最近写的关于java线程池ScheduleExecutorServ ...
- java之线程
java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
- Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别
一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...
- Java的线程安全
线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- java 多线程—— 线程让步
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java 多线程—— 线程等待与唤醒
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java的线程模型
并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...
随机推荐
- python flask框架学习——开启debug模式
学习自:知了课堂Python Flask框架——全栈开发 1.flask的几种debug模式的方法 # 1.app.run 传参debug=true app.run(debug=True) #2 设置 ...
- Swift4.0复习扩展
1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...
- windows xp能连上网但是不能上网的解决办法
说明:我是使用这个办法解决了,并不能针对所有的情况. 具体情况是,在win xp下,能够看到当前的无线网络,并且也能够连接到无线网络. 但是连接上无线网络之后,他的ip地址和网关是没有改变的.所以也连 ...
- javascript常用小案例
常用javascript小案例 样式调节 //注: 这个可以控制td中的字段成行显示 #modelInfos td,th { white-space: nowrap; } //文本输入框随着内容尺寸往 ...
- (一)构建基于ubuntu docker MySQL 5.6 镜像并推送到Docker Hub
一,创建目录二,文件准备三,构建四,使用五,在宿主机上连接docker 中的mysql六,推送镜像到Docker hub 一,创建目录 mkdir -p mysql/5.6 二,文件准备 注意执行脚本 ...
- PAT(B) 1071 小赌怡情(Java)
题目链接:1071 小赌怡情 (15 point(s)) 题目描述 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大 ...
- 1183: 零起点学算法90——海选女主角(C语言)
一.题目 http://acm.wust.edu.cn/problem.php?id=1183&soj=0 二.分析 从描述来看,就是找出一个二维数组中绝对值最大的数: 带符号的32位整数,刚 ...
- Smart3D飞控&地方坐标系
资源 ContextCapture(原Smart3D)教程 | Wish3D 航测数据处理答疑55问!涉及CC.Pix4D.Photoscan.EPS等常见软件问题_云进行 飞控软件 Smart3D常 ...
- PowerBuilder学习笔记之行删除卡死问题
在数据窗口勾选这两个选项后,在删除行数据时会导致系统直接崩溃退出
- Quartz入门以及相关表达式使用
目的: 1.Quartz简介及应用场景 2.Quartz简单触发器 SimpleTrigger介绍 3.Quartz表达式触发器CronTirgger介绍 4.Quartz中参数传递 5.Spring ...