概念及优点
进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。
我们在Windows任务管理器的进程中看到的exe程序,这就是我们所说的进程。如QQ;
线程:可以理解为进程中独立运行的子任务。比如QQ.exe运行时可以有好友视频线程,发送表情线程。
多线程优点:可以在同一时间内运行更多的不同种类的任务。
(1)使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;
(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;
(4)可以随时停止任务;
(5)可以分别设置各个任务的优先级以优化性能。
(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;
(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;
(4)可以随时停止任务;
(5)可以分别设置各个任务的优先级以优化性能。
缺点:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
2、使用多线程
1)继承Thread:Thread.java类中的start()方法通知“线程规划期”此线程已经准备就绪,等待调用线程对象的run()方法。其实就是让系统安排一个时间来调用Thread中的run方法,即使线程运行,启动,具有异步的执行的效果。线程顺序执行具有随机性。
2)实现Runnable接口:由于java单继承性,所以对于已有父类的线程类就需要实现Runnable接口的类来实现多线程。
如下方法中:
Thread(Runnable target);//分配Thread新对象
Thread(Runnable target,String name);
//代码示例
Runnable runnable= new MyRunnable();
Thread thread= new Thread(runnable);
thread.start();
同时Thread.java类也实现了Runnable接口
3)实例变量与线程安全:不共享数据时,多个线程会独自运行数据;共享变量时:多个线程共享一个资源,会出现非线程安全问题。可以通过synchronized给对象或方法加锁(互斥区),来避免值被更改,值不同步的情况。
3、currentThread()方法
返回代码段正在被那个线程调用的信息。如Thread.currentThread().getName();
this与currentThread()的区别
4、isAlive()方法
判断当前的线程是否出于活动状态。即线程已经启动且尚未终止。
5、sleep()方法
指定毫秒内让当前“正在执行的线程”休眠。
6、getId()方法
取得线程的唯一标识。
7、停止线程
3种方法:1、退出标志,使线程正常退出,run()方法完成后线程终止。2、stop()强制终止线程,由于其安全性以及数据不同步等原因,作废。 3、使用interrupt()方法中断线程。
其中,interrupt不可以立即终止线程;判断线程是否终止interrupted()(执行后具有将状态标识置清除)和isInterrupted()(不能清除状态标志);
另外可以使用异常发终止状态,即用try...catch 拦截错误信息。(推荐使用,可以对异常信息进行相关的处理);
在沉睡时终止:在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态值。使之成为false;
能停止的线程---暴力停止:stop()会抛出java.lang.ThreadDeath异常,同时释放锁导致数据不一致;
return也可以停止线程,
8、暂停线程
suspend与resume,该方法极易造成公共的同步对象的独占,,是其他线程无法访问公共同步对象;不同步性,由于现成的暂停使数据不能同步;
9、yield方法
放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。
10、线程的优先级
线程的优先级具有继承性,优先级高的线程得到的CPU资源较多,优先级高的线程先执行完。优先级具有随机性(针对于优先级比较接近的线程);优先级高的线程运行的快。
11、守护进程
典型的守护进程------垃圾回收线程,当进程中没有非守护进程时,垃圾回收线程就不存在,自动销毁。
以上是对多线程基础知识的学习与回顾。