java基础之线程

1:多线程(理解)
    (1)多线程:一个应用程序有多条执行路径
        进程:正在执行的应用程序
        线程:进程的执行单元,执行路径
        单线程:一个应用程序只有一条执行路径
        多线程:一个应用程序有多条执行路径
        
        多进程的意义?
            提高CPU的使用率
        多线程的意义?
            提高应用程序的使用率
    (2)Java程序的运行原理及JVM的启动是多线程的吗?
        A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
        B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。
    (3)多线程的实现方案(自己补齐步骤及代码    掌握)
        A:继承Thread类
        B:实现Runnable接口
    (4)线程的调度和优先级问题
        A:线程的调度
            a:分时调度
            b:抢占式调度 (Java采用的是该调度方式)
        B:获取和设置线程优先级
            a:默认是5
            b:范围是1-10
    (5)线程的控制(常见方法)
        A:休眠线程
        B:加入线程
        C:礼让线程
        D:后台线程
        E:终止线程(掌握)
    (6)线程的生命周期(参照    线程生命周期图解.bmp)
        A:新建
        B:就绪
        C:运行
        D:阻塞
        E:死亡
    (7)电影院卖票程序的实现
        A:继承Thread类
        B:实现Runnable接口
    (8)电影院卖票程序出问题
        A:为了更符合真实的场景,加入了休眠100毫秒。
        B:卖票问题
            a:同票多次
            b:负数票
    (9)多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)
        A:是否有多线程环境
        B:是否有共享数据
        C:是否有多条语句操作共享数据
    (10)同步解决线程安全问题
        A:同步代码块
            synchronized(对象) {
                需要被同步的代码;
            }
            
            这里的锁对象可以是任意对象。
            
        B:同步方法
            把同步加在方法上。
            
            这里的锁对象是this
            
        C:静态同步方法
            把同步加在方法上。
            
            这里的锁对象是当前类的字节码文件对象(反射再讲字节码文件对象)
    (11)回顾以前的线程安全的类
        A:StringBuffer
        B:Vector
        C:Hashtable
        D:如何把一个线程不安全的集合类变成一个线程安全的集合类

            用Collections工具类的方法即可。




判断解决线程安全问题:
1、是否是多线程环境
2、是否有共享数据
3、是否有多条语句操作共享数据

解决:
   把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行的时候,别人不能执行

java提供了同步机制

synchronized(对象) {
    需要同步代码
}


注意:
    同步可以解决安全问题的根本原因在哪个对象上,该对象如同锁的功能
    多个线程必须是同一把锁

同步代码块的锁对象:任意对象,
同步方法的格式及锁对象,
     把同步关键字加在方法上,
    同步方法是谁:this
静态方法及锁对象,
    静态方法的锁对象是:类的字节码文件对象



线程安全类
StringBuffer
Vector
Hashtable

Vector是线程安全的时候去考虑使用的,但即使要安全,我们尽量不要使用
那么到底用谁呢?
List<String> list1 = new ArrayList<String>();  //线程不安全
List<String> list2 = Collections.synchronizedList(new ArrayList<String>());    //线程安全




package com.wassili_04;

public class SellTicket implements Runnable{

	private int tickets = 100;
	
	private Object obj = new Object();
	
	@Override
	public void run() {
		while (true) {
			synchronized(obj) {
				if (tickets > 0) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票");
				}
			}
			
		}
		
	}
	
}




package com.wassili_04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SellTicketDemo {

	public static void main(String[] args) {
		SellTicket st = new SellTicket();
		
		Thread t1 = new Thread(st, "窗口1");
		Thread t2 = new Thread(st, "窗口2");
		Thread t3 = new Thread(st, "窗口3");
		
		t1.start();
		t2.start();
		t3.start();

		List<String> list1 = new ArrayList<String>();  //线程不安全
		List<String> list2 = Collections.synchronizedList(new ArrayList<String>());	//线程安全
	}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值