java的多线程

进程:程序的执行过程,持有内存资源

线程:是系统的最小执行单元,共享进程的资源

线程之间可以互斥、也可以同步;

Thraed类:

通过一个案例来了解线程Thread类和Runnable接口的运用:

案例须知:

1、实现舞台线程(继承Thread类)

2、实现军队线程,通过调用军队线程实现农民和政府双军队线程,将军队交战线程放到舞台线程中开始运行,双线程是交叉运行;(继承Runnable接口)

3、实现一个英雄进场线程(继承Thread类),在双线程结束后将英雄入场线程放到舞台线程中运行,运行后结束后舞台线程随之结束;

军队线程:

package com.thread;

public class Army implements Runnable {
volatile boolean keepRunning =true;//保证了线程可以读取其他线写入的值
@Override
public void run() {
// TODO Auto-generated method stub
while(keepRunning) {
for(int i = 0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]次");
Thread.yield();//让出处理器时间,下次进攻是谁还不一定呢
}
}
System.out.println(Thread.currentThread().getName()+"结束了战斗");
} }

英雄进场线程:

package com.thread;

public class Hero extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName()+"加入了战斗");
for(int i = 0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+"释放技能:“捞人自捞”"); }
System.out.println(Thread.currentThread().getName()+"结束了战斗");
}
}

舞台线程:

package com.thread;

public class Stage extends Thread {
public void run() {
Army armyOfZf = new Army();
Army armyOfNm = new Army();
Thread armyOfZfTh = new Thread(armyOfZf,"政府");
Thread armyOfNmTh = new Thread(armyOfNm,"农民");
armyOfNmTh.start();
armyOfZfTh.start();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
armyOfZf.keepRunning = false;
armyOfNm.keepRunning = false;
Thread mrya = new Hero();
mrya.setName("余桉");
System.out.println("农民和政府打的不可开交时"+mrya.getName()+"冲入了战场!!!");
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mrya.start();
try {
mrya.join();//等待mrya线程运行完后,程序才会继续执行;
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
armyOfNmTh.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Stage test = new Stage();
test.start();
} }

注意:这里的案例我们停止线程是用了一个一个布尔值keepRunning,将改变其值使得线程运行完毕,而java本身的Thread类有提供一个stop()的线程停止方法,但这个方法是不正确的停止方法,因为这个是“猝死”类型的停止方法,会让线程直接停止,这样会使得我们没法输出提示信息,也没能有效地处理线程的后=后续清理工作;因此说这个方法是不正确的停止方法;

两个线程发生争用条件:两个不同的线程同时访问同一资源,在线程一把原本的资源改了,但是资源并没来得及传入硬盘而是只存在于内存中,此时若是切换到线程2.线程二对该资源操作完成后又切换到线程一,线程一继续刚没结束的上下文,把刚修改存在内存中的资源一再返回硬盘中,此时就会使得线程二对于资源的操作修改被覆盖,导致资源的状态和我们想要的不一样;

线程互斥和同步:互斥即对线程进行加锁,需等线程解锁后别的线程才可以操作该共享对象;同步是指线程对共享对象的使用,需要让其共享资源满足于什么条件下才可以使用,此时线程会调用wait()方法进入等待,等别的线程操作完共享对象,达到该条件后再触发notifyAll(),唤醒等待状态的所有线程;

先创建一个共享对象:

线程开始之前:

通过synchronized关键字定义临界端,wait()使得线程进入等待阶段,在Wait set集合中进行等待,别的线程可以进入这个临界端,当运行notifyAll()时唤醒所有线程;

java基础笔记(8)的更多相关文章

  1. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  2. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  3. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  4. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  5. Java基础笔记1

    java (开源,跨操作系统)j2ee jre java基础 javaoop java高级 JDK(JAVA developer Kitool): java开发工具 (开发人员使用) JRE(java ...

  6. Java基础笔记(一)——JDK、JRE、JVM

    JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...

  7. Java基础笔记05-06-07-08

    五.今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 ...

  8. Java基础笔记-抽象,继承,多态

    抽象类: abstract修饰 抽象方法必须定义在抽象类中,抽象类不能创建对象. 在抽象方法中可以不定义抽象方法,作用是:让该类不能建立对象. 特点是: 1.定义在抽象类中 2.方法和类都用abstr ...

  9. Java基础笔记(一)

    本文主要是我在看<疯狂Java讲义>时的读书笔记,阅读的比较仓促,就用 markdown 写了个概要. 第一章 Java概述 Java SE:(Java Platform, Standar ...

  10. JAVA基础笔记10-11-12-13-14

    十.今日内容介绍 1.继承 2.抽象类 3.综合案例---员工类系列定义 01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在J ...

随机推荐

  1. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary

    题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...

  2. jeesite安装时Perhaps you are running on a JRE rather than a JDK

    使用自己本地安装的maven,启动jeesite报错: No compiler is provided in this environment. Perhaps you are running on ...

  3. 配置文件:mainfest.xml

    AndroidManifest.xml 是每个android程序中必须的文件.   它位于整个项目的根目录,描述了package中暴露的组件(activities,services, 等等),他们各自 ...

  4. CF191C Fools and Roads - 树剖解法

    Codeforces Round #121 (Div. 1) C. Fools and Roads time limit per test :2 seconds memory limit per te ...

  5. Android使用init.rc触发脚本实现隐藏内置应用

    [实现逻辑] 通过在property_service.c中设置标志位,在设置中实现接口改变标志位, 使用init.rc中声明的服务来侦听标志位的变化,显式启动声明的服务,执行对应的脚本,把应用后缀从a ...

  6. Spring Boot教程(二十)开发Web应用(1)

    静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...

  7. material of DeepLearning

    下面这个链接是深度学习相关的资料,内含很多dl的链接资料: http://blog.csdn.net/augusdi/article/details/20238157 MIT Deep Learnin ...

  8. jQuery file upload里面的_create的调用和_initEventHandlers的调用

    首先是jquery.ui.widget.js中_createWidget方法内部调用 this._create(); this._trigger( "create", null, ...

  9. JNI写本地日志文件

    调试JNI库 我喜欢反编译APK 然后替换.so文件 然后再编译成APK 其中写日志的话 用fopen("/sdcard/lei.txt","wb+")

  10. [torch] pytorch hook学习

    pytorch hook学习 register_hook import torch x = torch.Tensor([0,1,2,3]).requires_grad_() y = torch.Ten ...