线程

来源:互联网 发布:欧莱雅男士 知乎 编辑:程序博客网 时间:2024/04/30 12:21
线程


1、进程(Process)进程是操作系统结构的基础;
是一个正在执行的程序;计算机中正在运行的程序实例;
可以分配给处理器并由处理器执行的一个实体;
由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。
2、并发:同时进行,但是需要抢占同一个cpu,基于时间片来调度。
3、并行:同时占有不同的cpu分头执行。


线程(Thread):进程中分出的更小的单位,是一种轻量级的进程。
线程和进程最大的区别在于数据共享。
4、线程三要素:
线程的CPU、数据、代码
CPU不能共享。
两个线程共享代码:代表着两个线程做同样的事情。
两个线程共享数据:线程的最大用途。
进程之间共享数据比较麻烦:
借助与磁盘文件,进程A写,进程B读 效率低
Disk I/O效率极低
借助于操作系统中的变量,进程A写,进程B读
通过网络通信socket,效率也低,借助于系统外部
线程不同,线程是在同一个进程中开辟出若干个
线程单元,最大的好处就是能够共享数据。
资源访问效率大大提高,形成了线程间通信。线程
需要依托进程存在。进程中的数据是共享的。
5、多线程程序的四种模式:
(1)不共享代码,也不共享数据。
最简单,但应用不广泛。
Thread t1 = new MyThreadA();
Thread t2 = new MyThreadB();
此时t1和t2都属于new新建立状态


t1.start();
t2.start();
此时t1和t2属于Runnable可运行状态
当t1或者t2获得CPU时间偏食,处于Running运行状态
如果t1或者t2的run方法结束,进入Dead销毁状态
(2)共享代码,不共享数据。做同样的事情,
但操作数据不同。
(3)不共享代码,共享数据。两个线程对同一数据进行
读或者写操作。
注意临界资源的保护,要保证数据的安全。
在多线程下,被共享的数据需要加上锁。
锁的粒度:注意锁的范围的大小,
范围大了,效率会降低。
范围小了,可能会不安全。
(4)共享代码,共享数据。 做同样的事情,
操作的数据也相同。
6、创建一个线程的两种方法:
(1)写一个类A extends Thread,并且覆盖run()方法。
通过new A().start();
THread线程的start()方法可以启动线程。
等待CPU调度执行。不能直接使用run()调用,这样
不代表启动线程,只是普通方法的调用,线程调度
需要OS的配合。
(2)写一个类B implements Runable接口,实现run()方法
run()方法和Thread中的一样,都是希望线程执行的代码
将实现了Runable接口的对象作为构造参数,创建一个
Thread。new Thread(new B()).start();启动线程
7、java.lang.Thread类中常用的方法
public static Thread currentThread()
返回当前正在执行的线程的引用
静态方法,可以通过Thread直接调用
Thread.currentThread();
public long getId()
返回OS分配的唯一标识,id不能由程序指定。
public String getName()
获取线程对象的名称,系统会有默认分配的系统名称Thread()
public void setName(String name)
给线程对象设置名称,用来代替系统默认的名称
public int getPriorty()
获得线程的优先级1~10,数字越大,优先级越高
public void setPriority(int)
设置线程优先级,优先级和系统紧密相关,
不同的系统拥有不同种优先级
比如有的系统就5级
优先级具备不稳定性,尽量不要提高优先级的方式控制线程。
public boolean isDeamon()
判断是否是后台线程(守护线程)
public void setDeamon(boolean)true
将线程设置为后台线程
特点:在后台运行
Deamon线程的结束条件:
1)run执行结束
2)其他非deamon线程(user Thread)执行结束
public static void sleep(long)
让当前线程休眠多少毫秒
Thread.sleep(1000);
让当前正在执行的线程休眠1秒,无需指定某线程。
public static void sleep(long millis, int nanos)
指定毫秒数和纳秒数
public static void yield()
让当前正在运行的线程主动放弃cpu执行权,
回到runnable状态
8、synchronized关键字
synchronized(this){
线程安全的代码块——同步代码块
当线程A执行到次代码块时,会先拿到this
对象提供的一把锁。
若果拿到锁,就会进入到同步代码块执行,
如果拿不到,就会进入到this对象的锁池中等待
当结束同步代码块时,线程交还该对象的锁
}
任何对象都有且仅有一个锁标记,可以分配给某线程持有。
如果其他线程也需要持有此锁标记,就需要进入该对象的锁池等待
等到持有锁标记的线程结束后,叫回锁标记,方可获取。


注:阻塞池是系统池,整个系统就一个;
锁池,有多少个对象,就有多少个锁池。

9、线程安全的类:
StringBuffer
Vector
Hashtable
Collections.synchronizedList(...);
Collections.synchronizedMap(...);
原创粉丝点击