8.1多线程上

来源:互联网 发布:linux chroot命令 编辑:程序博客网 时间:2024/06/15 14:57
1:多线程
(1)进程:
正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
线程:
是进程中的单个顺序控制流,是一条执行路径
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序。
(2)Java程序的运行原理及JVM的启动是多线程的吗?
A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程去调用main方法。

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

(3) Thread类的基本获取和设置方法
public final String getName():获取线程的名称。
public final void setName(String name):设置线程的名称
针对不是Thread类的子类中如何获取线程对象名称呢?
public static Thread currentThread():返回当前正在执行的线程对象
Thread.currentThread().getName()

(4)多线程的实现

A:继承Thread类

步骤

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

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

C:创建对象

D:启动线程

B:实现Runnable接口

步骤:

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

B:重写run()方法

C:创建MyRunnable类的对象

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

run()和start()的区别?
run():仅仅是封装被线程执行的代码,直接调用是普通方法

start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

为什么要重写run()方法?

run()里面封装的是被线程执行的代码

(4)线程的调度和优先级问题
A:线程的调度

a:分时调度

所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片

b:抢占式调度 

优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。

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

获取线程对象的优先级
public final int getPriority():返回线程对象的优先级
设置线程对象的优先级
public final void setPriority(int newPriority):更改线程的优先级。 
线程默认优先级是5。
线程优先级的范围是:1-10。
线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。
IllegalArgumentException:非法参数异常。
抛出的异常表明向方法传递了一个不合法或不正确的参数。 

(5)线程的控制(常见方法)

A:休眠线程

public static void sleep(long millis)

B:加入线程

public final void join():等待该线程终止。 

C:礼让线程

 public static void yield():暂停当前正在执行的线程对象,并执行其他线程。 
让多个线程的执行更和谐,但是不能靠它保证一人一次。

D:后台线程

public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。 

E:终止线程

public final void stop():让线程停止,过时了。
public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。

(6)线程的生命周期


A:新建:创建线程对象

B:就绪:有执行资格,没有执行权
C:运行:有执行资格,有执行权
D:阻塞:没有执行资格,没有执行权
E:死亡:线程对象变成垃圾等待被回收
(7)多线程安全问题的原因(判断一个程序是否有线程安全问题的依据)
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据
(8)同步解决线程安全问题
A:同步代码块
synchronized(对象) {
需要被同步的代码;
}
这里的锁对象可以是任意对象。
B:同步方法
把同步加在方法上。
这里的锁对象是this
C:静态同步方法
把同步加在方法上。

这里的锁对象是当前类的字节码文件对象

(9)如何把一个线程不安全的集合类变成一个线程安全的集合类
用Collections工具类的方法即可。

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

1 0
原创粉丝点击