#线程简介
多任务:
进程:
多线程:
说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的的单位。
注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错局。
#线程实现
三种创建方式
Thread方式创建线程
案例1
Runnable方式创建线程
案例2
Callable方式创建线程
案例1
静态代理
1)
#线程状态
#线程同步
线程状态
线程方法
停止线程的方法(推荐使用)
线程的休眠方法 sleep
模拟网络延时案例
模拟网络延时:放大问题的发生性
模拟倒计时
yield方法
join方法
线程优先级
守护线程
线程同步
synchronized
不安全的买票
package com.zgl.work;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//不安全的买票
//线程不安全,有负数
public class Test {
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
new Thread(buyTicket,"小明").start();;
new Thread(buyTicket,"美团买票").start();
new Thread(buyTicket,"黄牛买票").start();
}
}
class BuyTicket implements Runnable{
//票
private int ticketNums = 10;
//外部停止线程的方式
boolean flag = true;
@Override
public void run() {
//买票
while (flag) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void buy() throws InterruptedException {
//判断是否有票
if (ticketNums<=0) {
flag = flag;
return;
}
//模拟网络延时
Thread.sleep(100);
//买票
System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);
}
}
线程安全的买票
package com.zgl.work;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//不安全的买票
//线程不安全,有负数
public class Test {
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
new Thread(buyTicket,"小明").start();;
new Thread(buyTicket,"美团买票").start();
new Thread(buyTicket,"黄牛买票").start();
}
}
class BuyTicket implements Runnable{
//票
private int ticketNums = 10;
//外部停止线程的方式
boolean flag = true;
@Override
public void run() {
//买票
while (flag) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void buy() throws InterruptedException {
//判断是否有票
if (ticketNums<=0) {
flag = flag;
return;
}
//模拟网络延时
Thread.sleep(100);
//买票
System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);
}
}
#线程通信