JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
我们接着多线程讲
一.生产者和消费者
什么是生产者和消费者?我们解释过来应该是生产一个,消费一个,的意思,具体我们通过例子来说
package com.lgl.hellojava;
//公共的 类 类名
public class HelloJJAVA {
public static void main(String[] args) {
/**
* 生产者和消费者
*/
Resrource res = new Resrource();
Produce pro = new Produce(res);
Consumer con = new Consumer(res);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
t1.start();
t2.start();
}
}
// 资源
class Resrource {
private String name;
private int count = 1;
private boolean flag = false;
// 生产
public synchronized void set(String name) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 每次设置添加编号
this.name = name + "-" + count++;
System.out.println(Thread.currentThread().getName() + "--生产者--"
+ this.name);
flag = true;
this.notify();
}
}
// 消费
public synchronized void out() {
if (!flag)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--消费者--"
+ this.name);
flag = false;
this.notify();
}
}
// 生产
class Produce implements Runnable {
private Resrource res;
public Produce(Resrource res) {
this.res = res;
}
@Override
public void run() {
while (true) {
System.out.println("Android");
}
}
}
// 消费
class Consumer implements Runnable {
private Resrource res;
public Consumer(Resrource res) {
this.res = res;
}
@Override
public void run() {
while (true) {
res.out();
}
}
}
当我们生产一个,消费一个,就具有多线程的特性,如果出现其他现象,那就说明你的线程存在安全隐患了
二.停止线程
怎么让线程停?你会想到stop方法
既然已过时,我们就的去想其他办法了,跟其原理,是什么?run方法结束就是线程停止,那怎么让run方法结束?
- 只要控制循环,就可以让run方法结束,也就是线程的结束
我们写个实例
package com.lgl.hellojava;
import org.omg.CORBA.FloatHolder;
//公共的 类 类名
public class HelloJJAVA {
public static void main(String[] args) {
/**
* 线程停止
*/
stopThread s = new stopThread();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
int num = 0;
while (true) {
if (num++ == 60) {
s.changeFlag();
break;
} else {
System.out.println(Thread.currentThread().getName()
+ "Main run");
}
}
}
}
class stopThread implements Runnable {
private boolean flag = true;
@Override
public void run() {
while (flag) {
System.out.println(Thread.currentThread().getName() + "Thread run");
}
}
public void changeFlag() {
flag = false;
}
}
逻辑十分简单,只要达到要求,就停止,但是还有一种特殊情况,当线程处于冻结状态,就不会读取到标记,那线程就不会结束,我们看
package com.lgl.hellojava;
import org.omg.CORBA.FloatHolder;
//公共的 类 类名
public class HelloJJAVA {
public static void main(String[] args) {
/**
* 线程停止
*/
stopThread s = new stopThread();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
int num = 0;
while (true) {
if (num++ == 60) {
s.changeFlag();
break;
} else {
System.out.println(Thread.currentThread().getName()
+ "Main run");
}
}
}
}
class stopThread implements Runnable {
private boolean flag = true;
@Override
public synchronized void run() {
while (flag) {
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()
+ "InterruptedException run");
}
System.out.println(Thread.currentThread().getName() + "Thread run");
}
}
public void changeFlag() {
flag = false;
}
}
这样就循环了。而在我们多线程中,提供了一个中断的方法Interupted
三.守护线程
守护线程其实也是Interupted中的东西,我们来看
你只要在启动线程前调用就可以了,就标记成了守护线程,就是一个依赖关系,你在我在,你不在我也不在;
四.Join方法
这个也是一个方法,意思是等待线程终止
我们倒是可以写个小例子
package com.lgl.hellojava;
//公共的 类 类名
public class HelloJJAVA {
public static void main(String[] args) {
/**
* Join
*/
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
try {
// t1要申请加入到运行中来
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
for (int i = 0; i < 100; i++) {
System.out.println("miam" + i);
}
System.out.println("main over");
}
}
class Demo implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "=---" + i);
}
}
}
我们可以满足条件下 ,临时加入一个线程
当A线程执行到了B线程的join方法时,A线程就会等待,等B线程都执行完,A才会执行,A可以用来临时加入线程执行。
五.线程的优先级
线程有优先级,默认的优先级都是5,这个是可以改变的,t1.setPriority(优先级);
我们可以拿上面的例子来做个比较
package com.lgl.hellojava;
//公共的 类 类名
public class HelloJJAVA {
public static void main(String[] args) {
/**
* Join
*/
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
//权限虽然高,只是频率高而已
t1.setPriority(Thread.MAX_PRIORITY);
t2.start();
for (int i = 0; i < 100; i++) {
System.out.println("miam" + i);
}
System.out.println("main over");
}
}
class Demo implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "=---" + i);
}
}
}
我们这里还有一个小方法yield,临时停止的意思,我们可以看例子
package com.lgl.hellojava;
//公共的 类 类名
public class HelloJJAVA {
public static void main(String[] args) {
/**
* Join
*/
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start();
for (int i = 0; i < 100; i++) {
// System.out.println("miam" + i);
}
System.out.println("main over");
}
}
class Demo implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "=---" + i);
Thread.yield();
}
}
}
我们可以看到
主线程并没有运行,那就对了,因为暂停了
我们到这里,本篇就结束了,同时线程所讲的知识也讲完了,线程博大精深,很值得我们学习,我所讲的,仍然只是一些皮毛罢了,希望大家多用心研究一下
我的群555974449也可以欢迎各位来讨论
JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止的更多相关文章
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java进阶(三十五)java int与integer的区别
Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块
JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...
- “全栈2019”Java异常第十五章:异常链详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第八十五章:实现接口中的嵌套接口
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周
java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...
- “全栈2019”Java第七十五章:内部类持有外部类对象
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第六十五章:接口与默认方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 聪明的搜索算法’ A*算法
A*算法 是一种启发式的搜索算法. 了解BFS.DFS或者Dijkstra算法的人应该知道.这些算法都是一种向四周盲目式搜索的方法. 启发式搜索: 启发式搜索就是在状态空间中的搜索 ...
- 初识Redis系列之二:安装及简单使用
仅介绍windows下的安装 一:下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的 ...
- Linux系统中安装Oracle过程记录
第一章 安装数据库软件 1.1 修改密码及创建目录和权限 创建oracle用户和组 创建相关目录并赋权 1.2 设置oracle用户环境变量 ORACLE_BASE:产品基目录 ORACLE_HOME ...
- JavaScript正则表达式模式匹配(2)——分组模式匹配
var pattern=/google{4,8}$/; // {4,8}$表示匹配结尾4-8次 var str='googleeeeeeeee'; // 表示e的4-8次 alert(pattern. ...
- C# ref与out
ref参数是引用,out参数为输出参数.我写一个控制台的程序来说明一下两者的特点和区别: class Program { 3 public static void RefMethod( ref int ...
- Python中切片的工作原理
切片时的索引是在两个字符之间.左边第一个字符的索引为 0,而长度为 n 的字符串其最后一个字符的右界索引为n. 例如: +---+---+---+---+---+---+ | P | y | t | ...
- Docker实例:创建一个点到点连接
默认情况下,Docker 会将所有容器连接到由 docker0 提供的虚拟子网中. 用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接. 解决办法很简单:创建一对 peer 接口,分别 ...
- Bootstrap3 表单-输出内联表单
为 <form> 元素添加 .form-inline 类可使其内容左对齐并且表现为 inline-block 级别的控件.只适用于视口(viewport)至少在 768px 宽度时(视口宽 ...
- Gradle 1.12用户指南翻译——第46章. Java 库发布插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- eclipse properties 插件
eclipse properties 插件安装,分享牛,分享牛原创.eclipse properties 编辑器使用. eclipse因为是原生的,可能集成的插件不多,需要自己手动安装.eclipse ...