多线程
- 多线程可以让程序具备多个并发的执行操作;
- 线程是存在生命周期的。
新建start() 准备 运行 堵塞 死亡
- Java中对于线程后,可以保证的只是让每个线程都启动,并且会执行结果,但是无法决定多个线程中哪个先执行,哪个后执行。
————————————————————
创建线程对象
- 继承Thread类:
继承Thread类的子类具备了多线程的能力,重写Thread类的run方法,当线程被启动的时候,run方法中的程序就成为了一条独立的执行线程。
例:
public class NumberThread extends Thread {
public CalThread(String name){
setName(name); //给当前线程取名
}
/**
* 线程start()方法操作的方法
*/
@Override
public void run() {
for(int i=0; i<100; i++){
String name = getName(); //获取当前线程的名称
System.out.println(name + "==" + i);
}
}
}
@Test
public void test1(){
NumberThread cal = new NumberThread("老司机线程");
cal.start(); //启动线程
}
- 实现Runnable接口
实现Runnable接口,需要实现Runnable接口中提供的run方法,当线程被启动的时候,run方法中的程序就成为了一条独立的执行线程。
例:
public class NumberThread implements Runnable {
private String name;
public NumberThread(String name){
this.name = name;
}
/**
* 线程start()方法操作的方法
*/
@Override
public void run() {
for(int i=0; i<100; i++){
System.out.println(name + "==" + i);
}
}
}
@Test
public void test2(){
NumberThread number = new NumberThread("老司机线程");
Thread t = new Thread(number);
t.start(); //启动线程
}
————————————————————
控制(调度)线程
- 睡眠的方法
当线程处于运行状态时,调用sleep方法将使线程从运行状态进入阻塞状态,从而使程序中断运行。使正在运行的线程让出CPU最简单的方法之一。
例:
public class NumberThread implements Runnable {
private String name;
public NumberThread(String name){
this.name = name;
}
/**
* 线程start()方法操作的方法
*/
@Override
public void run() {
for(int i=0; i<5; i++){
System.out.println(name + "==" + i);
try {
Thread.sleep(1*1000); //让线程睡眠1秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Test
public void test2(){
NumberThread number = new NumberThread("老司机线程");
Thread t = new Thread(number);
t.start(); //启动线程
}
- 让步的方法
当线程处于运行状态时,调用sleep方法将使线程从运行状态进入阻塞状态,从而使程序中断运行。将CPU让给哪一个线程是不确定的。
例:
public class YieldThread extends Thread {
public YieldThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
System.out.println("" + this.getName() + "-----" + i);
// 当i为30时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)
if (i == 30) {
yield();
}
}
}
}
public static void main(String[] args) {
YieldThread yt1 = new YieldThread("张三");
YieldThread yt2 = new YieldThread("李四");
yt1.start();
yt2.start();
}
————————————————————
案例:
需求分析:费玉清去健身房。
/**
* 费玉清
*
* @author qin
*/
public class FeiYuqing extends Thread {
@Override
public void run() {
int race = 100;
while(race > 0){
try {
int x = (int) (Math.random()*20);
if(race - x >= 0){
race = race - x;
sleep(1*1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("¥费玉清还有"+race+"米就逃跑成功啦");
}
System.out.println("**********费玉清逃跑成功");
}
}
/**
* 大猩猩
*
* @author qin
*/
public class Chimpanzee extends Thread {
@Override
public void run() {
int race = 100;
while(race > 0){
try {
int x = (int) (Math.random()*20);
if(race - x >= 0){
race = race - x;
sleep(1*1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("!大猩猩还有"+race+"米就抓到费玉清啦");
}
System.out.println("**********大猩猩抓到了费玉清,祝你们幸福");
}
}
/**
* 健身房
*
* @author qin
*/
public class Gym {
public static void main(String[] args) {
FeiYuqing fei = new FeiYuqing();
fei.start(); //费玉清跑
Chimpanzee chi = new Chimpanzee();
chi.start(); //大猩猩追
}
}
——————————————————————————————————————