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
.......一直交替循环下去

  

 线程的生命周期

day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)的更多相关文章

  1. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

  2. 多线程学习之三生产者消费者模式Guarded Suspension

    Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该 ...

  3. Linux——多线程下解决生产消费者模型

    我们学习了操作系统,想必对生产消费者问题都不陌生.作为同步互斥问题的一个经典案例,生产消费者模型其实是解决实际问题的基础模型,解决很多的实际问题都会依赖于它.而此模型要解决最大的问题便是同步与互斥.而 ...

  4. Kafka下的生产消费者模式与订阅发布模式

    原文:https://blog.csdn.net/zwgdft/article/details/54633105   在RabbitMQ下的生产消费者模式与订阅发布模式一文中,笔者以“数据接入”和“事 ...

  5. Python | 面试的常客,经典的生产消费者模式

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第23篇文章,我们来聊聊关于多线程的一个经典设计模式. 在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我 ...

  6. 生产消费者模式与python+redis实例运用(中级篇)

    上一篇文章介绍了生产消费者模式与python+redis实例运用(基础篇),但是依旧遗留了一个问题,就是如果消费者消费的速度跟不上生产者,依旧会浪费我们大量的时间去等待,这时候我们就可以考虑使用多进程 ...

  7. RabbitMQ下的生产消费者模式与订阅发布模式

    所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入   假设 ...

  8. 生产消费者模式与python+redis实例运用(基础篇)

    根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃:还有一个选择,做 ...

  9. C++11 多线程编程 使用lambda创建std::thread (生产/消费者模式)

    要写个tcp server / client的博客,想着先写个c++11多线程程序.方便后面写博客使用. 目前c++11中写多线程已经很方便了,不用再像之前的pthread_create,c++11中 ...

随机推荐

  1. ORA-10618: Operation not allowed on this segment 执行存储过程权限需声明

    执行SHOW_SPACE存储过程时只能在DBA角色下成功,在NORMAL角色用户下报错: ORA-10618: Operation not allowed on this segmentORA-065 ...

  2. sysdig

    centos 7 安装 https://sysdig.com/opensource/sysdig/install/ 1) Trust the Draios GPG key, configure the ...

  3. triton,docker,mesos

    triton user: jill /root/.sdc/docker/jill 下 root@1f6af9d8-8ed9-e940-9c6c-d9505ca25896:~/.sdc/docker/j ...

  4. CentOS7系列搭建Openvpn

    环境:CentOS Linux release 7.3.1611 (Core) 查看os版本命令:[root@openvpn ~]# cat /etc/redhat-release 命令记录如下: y ...

  5. Bean Validation技术实现对Javabean的校验

    概述:在java开发时,由于分层的原因(表现层-控制层-业务层-数据持久层),有时候需要对传入的Javabean进行校验,如果过多的校验会导致比较繁琐,做重复的工作,下面将介绍Bean Validat ...

  6. MySql log_bin

    [MySql log_bin] 1.查看 log_bin 是否启用. 默认情况下,mysql server 不启用 binlog(验证方法1: 执行"show variables" ...

  7. LuoguP1226 【模板】快速幂||取余运算

    题目链接:https://www.luogu.org/problemnew/show/P1226 第一次学快速幂,将别人对快速幂原理的解释简要概括一下: 计算a^b时,直接乘的话计算次数为b,而快速幂 ...

  8. 慕课网access_token的获取

    access_token的接口是微信公众号一个基础接口,access_token接口微信公众号一个非常重要的接口 access_token是微信公众号的全局唯一票据,公众号的所有接口的调用都需要使用到 ...

  9. VMware虚拟机安装Centos预安装环境图文教程1

    前言: 习惯了微软的各种可视化开发软件环境,突然接触Linux命令式的操作环境,总是会让人有些反感跟抵触的. 经过了几天的研究,发现Linux也并不是那么的深不可测.在配置网站部署环境的时候,系统集成 ...

  10. virtualbox Linux与Windows共享文件

    安装virtualbox增强功能 在Windows下新建文件用于共享,点设置->共享文件夹->添加共享文件,制定路径和名称(名称用于Linux中挂载使用)(选择固定分配) 在Linux中m ...