java第十九天

1.语句 变量 数据类型

2.条件语句和循环语句

if和switch

3.方法和重载

4.类和对象

5.面向对象的三大特性 封装 继承 多态 开闭原则 依赖抽象 高内聚 低耦合 重构 接口 抽象类 类与类之间的关系

6.常用API Scanner Random Collections Date DateFormat System StringBuilder String Object

7.集合 双列集合和单列集合

8.异常 try

笔记

多线程

1.什么是进程需要

应用程序的一个运行实例 包含程序所 需要的资源的内存区域,是操作系统进行资源分配的单元

进程隔离了正在执行的不同程序

优点:进程间相互独立 互不影响

2.什么是线程

进程中的一个执行单元(进程是程序的边界,要靠线程执行程序)线程执行方法 执行完毕释放线程

是CPU分配时间片的单位 一个进程包含多个线程

3.操作系统的分类 单任务 和 多任务
4.如何创建一个线程

5.Java如何决定执行那个线程 抢占式执行 设置线程的优先级(执行概率会提高)

第一种方式:创建Thread 子类

Java.lang.Thread 描述线程的类 我们想实现多线程 必须继承 Thread类

实现步骤

1.创建一个Thread子类

2.重写run方法 布置任务

3.创建Thread子类对象

4.调用Thread类中的方法 Start 开启新线程 执行run方法

第二种方式:实现runnable接口

Java.lang.Runnable 接口应该由那些打算通过某一线程执行其实例的类实现

类必须顶一个一个名为run的无参数的方法 用来布置任务

Thread 类方法和构造方法

Thread(Runnable target) 分配新的Tread对象

Thread(Runnable Target,String name) 分配新的Thread对象

实现步骤:

1.创建一个Runnable接口实现类

2.在实现类中重写Runnable接口的run方法

3.创建Runnable的实现类对象

4.创建Thread对象 构造方法中传递Runnable实现类对象

5.调用Thread的start方法

Runnable实现多线程的好处

1.避免了单继承的局限性

2.增强了程序的拓展性,降低了耦合度(解耦) 把继承关系改为组合关系

线程不安全

t0进来了 线程抢到了cpu的执行权 进入到run方法 执行到if之后 就失去了cpu执行权 睡了

t1也进来了 睡了

如何解决线程安全的问题

第一种方式 同步代码块

Synchronized(锁对象)

{

​ 可能会出现线程安全的问题的代码

}

注意事项:

1通过代码块中的锁对象 可以使用任意的对象

2.但是必须保证多个线程使用的锁对象是一个

3.锁对象的作用

把同步代码块锁住 只让一个线程在同步代码块执行

第二种方式:t使用同步方法
步骤:

1.把访问了共享数据的代码抽取出来 放到一个方法中

2.把方法添加关键字 Synchronized

第三种方式 lock

出现一样的数据 在–之前 同时执行到syso

案例:

public class MyThread {

	public static void main01(String[] args) {
		Tread1 td=new Tread1();//继承
		td.start();
		run();
	}

	private static void run() {
		for (int i = 0; i <20; i++) {
			System.out.println("main:"+i);
		}
	}
	public static void main02(String[] args) {
		//创建线程的第二种方式
	    Runnable r=new RunnableImpl();
	    
	    Thread td=new Thread(r);//组合  任务与线程
	    td.start();	    
	    run();
}
匿名内部类
public static void main03(String[] args) {
		Runnable runnable=new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i <20; i++) {
					System.out.println("runnable:"+i);
				}
			}
		};
		
		new Thread(runnable).start();
		new Thread(new  Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i <20; i++) {
					System.out.println("第三种:"+i);
				}
			}
		}).start();
Thread匿名内部类
Thread td= new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for (int i = 0; i <20; i++) {
					System.out.println("run:"+i);
				}
			}
		};
		td.start();
		
		run();			
}
线程常用的方法

SetName getName sleep currentThread

public static void main05(String[] args) throws InterruptedException {
//		Tread1 td=new Tread1();
//		//td.setName("线程1");
//		td.start();
//		String name= td.getName();
//		
//		System.out.println(name);
		
		for (int i = 0; i < 20; i++) {
			//Thread.sleep(1000);//睡眠 毫秒
			System.out.println(i);
		}
		
		System.out.println(Thread.currentThread());
	}
	
	public static void main(String[] args) {
	    Runnable r=new RunnableImpl1();
		Thread td=new Thread(r);
		td.start();
		
		Thread td1=new Thread(r);
		td1.start();
		
		Thread td2=new Thread(r);
		td2.start();
		
		Thread td3=new Thread(r);
		td3.start();
	}
}

重写Threa类的中run方法 设置线程任务
public void run() {
		setName("线程1");
		// TODO Auto-generated method stub
		for (int i = 0; i <20; i++) {
			System.out.println(getName()+i);
		}
	}
}
卖票案例:
//总票数
	private static int ticket=10;
	Object Obj=new Object();
	//设置线程任务 买票
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//使用无限循环 让买票操作重复执行
		while (true) {
			//锁对象 任意
			//synchronized (Obj) {
				
				extracted();
				
			//}
		}
	}
	//非静态方法 锁的是this
	private  synchronized void extracted() {
		synchronized(this){
			
			if (ticket>0) {
				try {
					Thread.sleep(10);//模拟出票的过程
				} catch (Exception e) {
					// TODO: handle exception
				}
				System.out.println(Thread.currentThread().getName()+"正在买第---->"+ticket+"张票");
				
				ticket--;
			}
		}
	}
	
	//静态的同步方法   了解
	//锁对象的问题  this是创建对象之后产生的   静态方法属于类 优先于this 所以静态没有this
	
	//静态方法的锁对象是本类class属性  --->class文件对象(反射)
	private static  synchronized void extracted1() {
		synchronized(RunnableImpl1.class){
			
			
			if (ticket>0) {
				try {
					Thread.sleep(10);//模拟出票的过程
				} catch (Exception e) {
					// TODO: handle exception
				}
				System.out.println(Thread.currentThread().getName()+"正在买第---->"+ticket+"张票");
				
				ticket--;
			}
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值