一.Java线程具有五中基本状态

新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

二. Java多线程的创建及启动

1.继承Thread类,重写该类的run()方法。

两个线程同时运行,随机产生4位随机字符

 import java.util.Random;

 public class 多线程 {

     public static Object lock = new Object();

     public static void randomString() {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 4; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
}
System.out.print(sb);
} public static void main(String[] args) { new Thread(new myTh1()).start();
new Thread(new myTh2()).start(); } } class myTh1 extends Thread {
@Override
public void run() {
while (true) { try {
synchronized (多线程.lock) {
多线程.randomString();
System.out.print("------"+Thread.currentThread().getName());
System.out.println();
}
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} class myTh2 extends Thread {
@Override
public void run() {
while (true) {
try {
synchronized (多线程.lock) {
多线程.randomString();
System.out.print("------"+Thread.currentThread().getName());
System.out.println();
}
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

2.实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象

主线程和两个实现Runnable接口的线程同时运行,线程对象只运行5次。

 public class 多线程Runnable {

     public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} new Thread(new myTh3()).start();
new Thread(new myTh4()).start(); }
}
class myTh3 extends Thread{
int i=0;
@Override
public void run() {
while (i<5) {
System.out.println(Thread.currentThread().getName());
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
} } } class myTh4 implements Runnable{ int i=0;
@Override
public void run() {
while (i<5) {
System.out.println(Thread.currentThread().getName());
i++;
} }
}

3.synchronized, wait, notify结合:

解决问题三个人去买票,张某有20元,李某10元。赵某5元。电影票5元一张,售货员只有3张5元的

 /*问题:
* 三个人去买票,张某有20元,李某10元。赵某5元。
* 电影票5元一张,售货员只有3张5元的。
*
* 思路:
* 张某买了票就会少3张5元的
* 李某买了票就会少1张5元的
* 赵某买了票就会多1张5元的
* 所以有三种情况:
* 一。赵某先买,张李都可以买
* 二。张某先买,此时李某买不了,只能等待赵某买了,再买
* 三。李某先买,此时张某买不了,只能等待赵某买了,再买
*
* 静态常量:售货员总钱数 sum=3
*
* 1.创建三个线程分别为张某,李某,赵某
* 2.判断此时sum值,合适就买票,减去相应的钱数,不合适就等待。
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class 多线程3 { public static int sum = 3;//设置零钱总张数为3张
public static Object look = new Object();//建立一个锁 public static List<Thread> arrayList = new ArrayList<>();//建立集合 保存这三个购买人的线程 public static void main(String[] args) throws InterruptedException {
//随机将赵某李某张某添加到集合中
arrayList.add(new li());
arrayList.add(new zhang());
arrayList.add(new zhao()); //通过迭代器遍历集合
Iterator<Thread> iterator = arrayList.iterator(); while (iterator.hasNext()) {
//获取线程
Thread t = iterator.next();
//线程启动
t.start();
//线程睡眠
t.sleep(2000);
} }
}
/**
* 张某线程
* @author Administrator
*
*/
class zhang extends Thread {
@Override
public void run() {
//因为要判断等待和唤醒,并且操作sum,所以在此处加锁
synchronized (多线程3.look) {
while (多线程3.sum < 3) {
try {
System.out.println("因为此时零钱不足:"+多线程3.sum+"张");
System.out.println("所以张某没买到电影票,等待购买");
多线程3.look.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} if (多线程3.sum > 2) {
多线程3.sum = 多线程3.sum - 3;
多线程3.look.notify();
System.out.println("张某买到了电影票");
System.out.println("此时零钱数为:"+多线程3.sum+"张");
}
}
}
}
/**
* 李某线程
* @author Administrator
*
*/
class li extends Thread {
@Override
public void run() {
synchronized (多线程3.look) {
while (多线程3.sum < 1) {
try {
System.out.println("因为此时零钱不足:"+多线程3.sum+"张");
System.out.println("所以李某没买到电影票,等待购买");
多线程3.look.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} if (多线程3.sum >= 1) {
多线程3.sum = 多线程3.sum - 1;
多线程3.look.notify();
System.out.println("李某买到了电影票");
System.out.println("此时零钱数为:"+多线程3.sum+"张");
} }
}
}
/**
* 赵某线程
* @author Administrator
*
*/
class zhao extends Thread {
@Override
public void run() {
synchronized (多线程3.look) {
if (多线程3.sum >= 0) {
多线程3.sum = 多线程3.sum + 1;
System.out.println("赵某买到了电影票");
System.out.println("此时零钱数为:"+多线程3.sum+"张");
多线程3.look.notify();
}
}
}
}

全部都是培训课后习题,最后一个足足搞了半天,希望我写的没毛病,求指教。。谢谢大佬。

java 多线程之synchronized wait/notify解决买票问题的更多相关文章

  1. java多线程之wait和notify协作,生产者和消费者

    这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...

  2. Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之ReentrantLock与Condition

    前言:这几天看了很多关于多线程的知识,分享一波.(但是目前接触的项目还未用到过,最多用过线程池,想看线程池 请看我之前的博客) 关于基本的理论等 参考如下: https://www.cnblogs.c ...

  3. JAVA多线程之Synchronized、wait、notify实例讲解

    一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...

  4. (二)java多线程之synchronized

    本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco198 ...

  5. JAVA多线程之Synchronized关键字--对象锁的特点

    一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...

  6. Java多线程之synchronized及其优化

    Synchronized和同步阻塞synchronized是jvm提供的同步和锁机制,与之对应的是jdk层面的J.U.C提供的基于AbstractQueuedSynchronizer的并发组件.syn ...

  7. java多线程之wait和notify

    多线程中的通信是非常重要的概念,线程直接实现通信就可以并发完成很多复杂工作. java在Object类中就设计了wait()和notify()两个方法,以解决这个问题. 1.释义: wait()方法将 ...

  8. Java多线程之Wait()和Notify()

    1.Wait()和Notify.NotifyAll都是Object的方法 2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成 3.当调用Wait()方法时,当前线程进入阻塞状态, ...

  9. Java多线程之synchronized(三)

    在多线程访问同一个对象中的不同的synchronized方法或synchronized代码块的前提下,也就是“对象监控器”为同一个对象的时候,也就是synchronized的锁为同一把锁的时候,调用的 ...

随机推荐

  1. 学习笔记(2)---Matlab 图像处理相关函数命令大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

  2. TypeScript高级类型

    交叉类型 将多个类型合并成一个类型,去两个类型的并集.与继承的区别是,继承可以有自己的属性,而交叉没有. interface DogInterface { run():void } interface ...

  3. MaxCompute技术人背后的故事:从ApacheORC到AliORC

    2019大数据技术公开课第一季<技术人生专访>来袭,本季将带领开发者们探讨大数据技术,分享不同国家的工作体验.本文整理自阿里巴巴计算平台事业部高级技术专家吴刚的专访,将为大家介绍Apach ...

  4. Linux安装JDK和Tomcat

    步骤如下: 1)在/root用户下建立jdk和tomcat两个文件夹并上传jdk-7u80-linux-x64.rpm和apache-tomcat-7.0.82.zip   2)安装jdk #  rp ...

  5. oracle Transactional

    从shutdown transactional命令发布起, 禁止建立任何新的oracle连接. 从shutdown transactional命令发布起,禁止启动任何新的事务. 一旦数据库上所有的活动 ...

  6. @codeforces - 932G@ Palindrome Partition

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个字符串 s,求有多少种方案可将其划分成偶数个段 \(p_ ...

  7. firefox扩展开发(一) : 扩展的基本结构

    用过firefox的人肯定要安装firefox的扩展,这样才能发挥火狐的全部实力.一般扩展是一个后缀为.xpi的文件,其实这个文件就是zip格式的压缩包,压缩了一个扩展所需要的所有目录和文件,基本的目 ...

  8. UVA_490:Rotating Sentences

    "R  Ie   n  te  h  iD  ne  kc  ,a   r  tt  he  es  r  eo  fn  oc  re  e   s  Ia   i  ad  m,  .  ...

  9. HDU 5572 An Easy Physics Problem【计算几何】

    计算几何的题做的真是少之又少. 之前wa以为是精度问题,后来发现是情况没有考虑全... 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意: ...

  10. Class.forName(“com.mysql.jdbc.Driver”)

    传统的使用jdbc来访问数据库的流程为: Class.forName(“com.mysql.jdbc.Driver”); String url = “jdbc:mysql://localhost:33 ...