day23总结——多线程

一、多线程——一个应用程序有多条执行路径

2、进程:正在执行的应用程序

3、线程:进程的执行单元,执行路径

4、多线程:一个应用程序有多条执行路径

~多进程的意义?——提高CPU的使用率

~多线程的意义?——提高应用程序的使用率

二、Java程序的运行原理及JVM的启动时多线程的吗?

A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程

B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程

三、多线程的实现方案

A:继承Thread类

/*

 * 方式1:继承Thread类。

 * 步骤

 * A:自定义类MyThread继承Thread类。

 * B:MyThread类里面重写run()?

 * 为什么是run()方法呢?

 * C:创建对象

 * D:启动线程

 */

public class MyThread extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(getName() + ":" + i);
		}
	}
}
public class MyThreadDemo {
	public static void main(String[] args) {
                // 创建两个线程对象
		MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();
                // 启动线程
		my1.start();
		my2.start();
	}
}

B:实现Runnable接口

/*

* 方式2:实现Runnable接口

* 步骤:

* A:自定义类MyRunnable实现Runnable接口

* B:重写run()方法

* C:创建MyRunnable类的对象

* D:创建Thread类的对象,并把C步骤的对象作为构造参数传递

*/

public class MyRunnable implements Runnable {
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}
public class MyRunnableDemo {
	public static void main(String[] args) {
		// 创建MyRunnable类的对象
		MyRunnable mr = new MyRunnable();
		Thread t1 = new Thread(mr, "CC");
		Thread t2 = new Thread(mr, "DD");

		t1.start();
		t2.start();
	}
}

四、线程的调度和优先级问题

A:线程的调度

B:获取和设置线程优先级

 * 如何获取线程对象的优先级?

 *   public final int getPriority():返回线程对象的优先级

 * 如何设置线程对象的优先级呢?

 *   public final void setPriority(int newPriority):更改线程的优先级。 

 

    a:分时调度     a:默认是5
    b:抢占式调度 (Java采用的是该调度方式)     b:范围是1-10

五、线程的控制(方法)

A:休眠线程         public static void sleep(long millis)
B:加入线程         public final void join():等待该线程终止。
C:礼让线程         public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
D:后台线程         public final void setDaemon(boolean on)
E:终止线程(掌握)  public void interrupt()

六、线程的生命周期

新建——就绪——运行——阻塞——死亡


七、电影卖票程序的实现

A:继承Thread类

B:实现Runnable接口

八、电影院卖票程序出问题

A:为了更符合真实场景,加入了休眠100ms

B:买票问题   a:同票多次   b:负数票

九、多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)

A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据

十、同步解决线程安全问题

                A:同步代码块
synchronized(对象) {
需要被同步的代码;
}
这里的锁对象可以是任意对象。

B:同步方法
把同步加在方法上。
这里的锁对象是this

C:静态同步方法
把同步加在方法上。
这里的锁对象是当前类的字节码文件对象(反射再讲字节码

十一、回顾以前的线程安全的类

A:StringBuffer
B:Vector
C:Hashtable
D:如何把一个线程不安全的集合类变成一个线程安全的集合类
用Collections工具类的方法即可。



猜你喜欢

转载自blog.csdn.net/qq_36383239/article/details/79452031
今日推荐