JAVA——Day 15线程、同步与死锁

线程

在这里插入图片描述在这里插入图片描述

多线程的创建与启动

在这里插入图片描述

Thread类

在这里插入图片描述在这里插入图片描述

package day15;

public class ThreadMethodLearn {
	public static void main(String[] args) {
		Thread t3 = new Thread(new testT());
		System.out.println(t3.getName());
		t3.setName("线程t3");//设置线程名称
		System.out.println(t3.getName());
	}
}

class testT implements Runnable{
	@Override
	public void run(a) {
		// TODO Auto-generated method stub
		System.out.println("测试");
	}
}

创建线程的两种方式

在这里插入图片描述

package day15;

public class ImplentThread extends Thread{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("多线程运行的代码");
		for(int i=0;i<5;i++) {
			System.out.println("这是多线程的逻辑代码"+i);
		}
	}
}

package day15;

/**
 * 创建线程方法一
 * 继承Thread类
 */
public class CreatThreadLearn {
	public static void main(String[] args) {
		Thread t = new ImplentThread();
		t.start();//启动线程
		System.out.println("**************");
		System.out.println("**************");
		System.out.println("**************");
		System.out.println("**************");
		System.out.println("===============");
		/**
		 * 多次运行main方法后
		 * 发现打印的*和方法中的打印语句混合
		 * 这就是多线程的异步
		 */
	}
}

实现Runnable接口实现多线程

在这里插入图片描述

package day15;
/**
 * 创建线程方法一
 * 继承Thread类
 * 通过实现Runnable接口实现多线程
 */
public class TestRunnable implements Runnable{

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"Runnable多线程运行的代码");
		for(int i=0;i<6;i++) {
			System.out.println("这是Runnable多线程的逻辑代码"+i);
		}
	}
}


package day15;

public class RunnableCreateThreadLearn {
	public static void main(String[] args) {
		System.out.println("*****************1");
		System.out.println("*****************2");
		System.out.println("*****************3");
		System.out.println("*****************4");
		System.out.println("*****************5");
//		Thread t = new Thread(new TestRunnable());
//		t.start();
		Thread t2 = new Thread(new TestRunnable(), "Thread的Runnable");
		t2.start();
		//可以先设置名,在run里用Thread.currentThread().getName()可以获得名字
	}
}
继承方式和实现方式的联系与区别

在这里插入图片描述

多线程程序的优点

在这里插入图片描述

线程的优先级

在这里插入图片描述

package day15;

/**
 * 线程的优先级,就是大概率执行
 * 优先级有1-10表示,数字越大越高,默认为5
 *
 */
public class ThreadMethodLearn {
	public static void main(String[] args) {
		Thread t2 = new Thread(new testT());
		Thread t3 = new Thread(new testT());
		System.out.println("t2的优先级:"+t2.getPriority());;
		System.out.println("t3的优先级:"+t3.getPriority());;
		//获取线程优先级
		t2.setPriority(3);
		System.out.println("t2的改变后优先级:"+t2.getPriority());
	}
}

class testT implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("测试");
	}
}

Thread类的有关方法

在这里插入图片描述

package day15;

public class TestRunnable implements Runnable{
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"Runnable多线程运行的代码");
		for(int i=0;i<6;i++) {
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}//1s执行一次循环
			System.out.println("这是Runnable多线程的逻辑代码"+i);
		}
	}
}

package day15;

public class ThreadMethodLearn {
	public static void main(String[] args) {
		Thread t2 = new Thread(new TestRunnable(),"t2线程");
		Thread t3 = new Thread(new TestRunnable(),"t3线程");
		t2.start();
		System.out.println("**********************************");
		System.out.println("**********************************");
		System.out.println("**********************************");
		try {
			t2.join();
			//阻塞,相当于把run方法代码插入这里,变成了同步
			//注意:前提是线程已经开始运行
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("**********************************");
		System.out.println("**********************************");
	}
}

线程的生命周期

在这里插入图片描述

线程的同步与死锁

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

线程死锁

在这里插入图片描述

线程通信

在这里插入图片描述

生产者和消费者

在这里插入图片描述

package day15;

/**
 * 生产者与消费者
 *
 */
public class CustomerAndCreaterLearn {
	public static void main(String[] args) {
		Clerk c = new Clerk();
		//消费时不生产,生产时不消费
		new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (c) {//无限循环代表无限的生产次数
					while(true) {
						if(c.productNum == 0) {//商品产品数为0
							System.out.println("产品数为0,开始生产");
							while(c.productNum < 4) {
								c.productNum += 1;
								System.out.println("库存"+c.productNum);
							}
							System.out.println("产品数为:"+c.productNum+",停止生产");
							c.notify();//唤醒消费者线程
							System.out.println("唤醒消费者线程");
						}
						else {
							try {
								c.wait();//生产者线程等待
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
					
				}
			}
		},"生产者").start();;
		new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (c) {//无限循环代表无限的生产次数
					while(true) {
						if(c.productNum == 4) {//商品产品数为4
							System.out.println("产品数为4,开始消费");
							while(c.productNum >0) {
								c.productNum -= 1;
								System.out.println("库存"+c.productNum);
							}
							System.out.println("产品数为:"+c.productNum+",停止消费");
							c.notify();//唤醒生产者线程
							System.out.println("唤醒生产者线程");
						}
						else {
							try {
								c.wait();//消费者线程等待
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
					
				}
			}
		},"消费者").start();
	}
}

class Clerk{
	public static int productNum = 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值