博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)
阅读量:5735 次
发布时间:2019-06-18

本文共 4389 字,大约阅读时间需要 14 分钟。

A:进程:

    进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

B:线程:

     线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

C:简而言之:

    一个程序运行后至少有一个进程,一个进程中可以包含多个线程

 

线程实现

  实现的两种方式

    继承Thread

public class MyThread extends Thread{	@Override	public void run() {		for (int i = 0; i < 100; i++) {			System.out.println(getName()+":"+i);		}	}}

  测试类

public class MyThread02 extends Thread {	@Override	public void run() {		MyThread t=new MyThread();//直接创建对象就能创建一个线程	        t.start();	}}

  

    实现Runnable

 

public class MyThreadImp implements Runnable{		int num;	public MyThreadImp(int num){		this.num=num;	}	@Override	public void run() {		for (int i = 0; i < 5; i++) {			System.out.println(Thread.currentThread().getName()+num++);		}	}}

 

  测试类

public class Test01 {	public static void main(String[] args) {		MyThreadImp mt=new MyThreadImp(10);		Thread t=new Thread(mt);		t.setName("张三");		t.start();		Thread t1=new Thread(mt);		t1.setName("李四");		t1.start();	}}

  

 

多线程安全问题

  线程的安全性==数据的安全性

      ①是否存在多线程

      ②是否有共享数据

      ③是否有多条语句执行共享数据

  解决办法  synchronized同步锁

eg:

 

public class MyThread implements Runnable {	int tickets;	public MyThread(int tickets) {		this.tickets = tickets;	}	Object o = new Object();	@Override	public void run() {		while (true) {			synchronized (o) {				if (tickets > 1) {					System.out.println(Thread.currentThread().getName() + "-"							+ tickets--);				}			}		}	}}

 

  测试类

MyThread mt=new MyThread(100);		Thread t=new Thread(mt);		t.setName("窗口1");		Thread t2=new Thread(mt);		t2.setName("窗口2");		Thread t3=new Thread(mt);		t3.setName("窗口3");		t.start();		t2.start();		t3.start();

  如果不给线程加锁  则会产生数据乱掉,可能会产生-1;结果我们不可预测。

在方法中给加锁,另一种方法则是给方法加锁eg:

public class MyThread01 implements Runnable{	 static int tickets=100;	public MyThread01(int tickets) {		this.tickets = tickets;	}	@Override	public void run() {		while (true) {				method01();		}	}	private synchronized void method01() {		if (tickets >= 1) {			System.out.println(Thread.currentThread().getName() + "-"					+ tickets--);		}	}}

  

抢红包案列:

 

public class MyThread implements Runnable {	int money;	int count;	public MyThread(int money, int count) {		this.money = money;		this.count = count;	}	@Override	public void run() {		// 产生一个随机数			method();	}	private synchronized void method() {		if (count > 1 && money != 0) {			Random r = new Random();			double d = (r.nextInt(money) + 1);			money -= d;			System.out.println(Thread.currentThread().getName() + ":" + d);			count--;		} else {			System.out.println(Thread.currentThread().getName() + ":"					+ money);		}	}}

  测试类

public class Hongbao {	public static void main(String[] args) {		MyThread mt=new MyThread(10,3);		Thread t=new Thread(mt);		t.setName("张三");		t.start();		t.setPriority(10);		Thread t1=new Thread(mt);		t1.setName("李四");		t1.start();		Thread t2=new Thread(mt);		t2.setName("李");		t2.start();	}}

  

 

生产消费者模式:

 

    解释了多线程唤醒机制(notify()是Object中的方法)

使用多线程中的案列

 

  产品  由于只是做测试使用 没有写全

public class Student {	String  name;	int age;	boolean flag;}

  

    生产者 如果消费者没有消费产品 则进行等待 ,只有消费了生产者才会进行生产

public class StThread implements Runnable {	private Student s;	public StThread(Student s) {		this.s = s;	}	int x;	@Override	public void run() {		while (true) {			synchronized (s) {				if (s.flag) {//如果flag=true;则说明已经有对象了  还没有消费,则进行等待					try {						s.wait();					} catch (InterruptedException e) {						e.printStackTrace();					}// 等待				}				if (x % 2 != 0) {					s.name = "赵云";					s.age = 44;				} else {					s.name = "张飞";					s.age = 22;				}				x++;				s.flag=true;//修改标记				s.notify();//唤醒			}		}	}}

  

    消费者  如果消费者没有东西消费 则会进行等待  有了东西,才会进行消费

public class GtThread implements Runnable {	private Student s;	public GtThread(Student s) {		this.s = s;	}	@Override	public void run() {		while (true) {//保证一直在等待中			synchronized (s) {				if (!s.flag) {//flag=false则进行等待  等待学生对象的产生					try {						s.wait();//线程等待					} catch (InterruptedException e) {						e.printStackTrace();					}				}				System.out.println(s.name + ":" + s.age);				s.flag=false;				s.notify();			}		}	}}

  

测试类

public class Test {	public static void main(String[] args) {		Student s=new Student();		StThread st=new StThread(s);		GtThread gt=new GtThread(s);		Thread t1=new Thread(st);		Thread t2=new Thread(gt);		t1.start();		t2.start();	}}

  输出结果

输出结果:赵云:44张飞:22赵云:44张飞:22赵云:44张飞:22赵云:44.......一直交替循环下去

  

 线程的生命周期

转载于:https://www.cnblogs.com/fjkgrbk/p/moreProgram.html

你可能感兴趣的文章
[NPM] Run npm scripts in series
查看>>
vs2013修改书签(vs书签文件位置)
查看>>
C语言学习笔记
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
PS 如何使用液化工具给人物减肥
查看>>
cvc-complex-type.2.4.c: The matching wildcard...
查看>>
android 读取json数据(遍历JSONObject和JSONArray)
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
<JavaScript语言精粹>-读书笔记(一)
查看>>
NPM教程
查看>>
Java学习笔记(40)——Java集合12之fail-fast
查看>>
Centos 配置IP的方式
查看>>
Go 的吉祥物,萌不萌
查看>>
Java 的swing.GroupLayout布局管理器的使用方法和实例
查看>>
Android中Activity和Fragment的生命周期的对比
查看>>
C++Primer_笔记_异常处理
查看>>
分区交换 alter table exchange partition 在线表 历史表交换
查看>>
zabbix详解:(二)添加被监控机器
查看>>
设计模式单列
查看>>
人像模式的灯光效果?iPhone 8开挂袭来
查看>>