一、进程与多线程的概念及线程的优点
进程:操作系统的基本运行单元,是程序的一次执行。
线程:在进程中独立运行的子任务。
Eg:QQ是一个进程,则好友视频,下载文件,数据传输等都是线程。
单任务:排队执行,一个时间就一个线程执行,也就是同步。
多任务:一个时间有多个线程同时执行,也就是异步。
二、多线程讲解
1.线程的创建
一种是继承Thread类,,另一种是实现Runnable接口。两种方法没有本质的区别,因为Thread类在底层也是实现了Runnable接口,
但是继承Thread类的方法不支持多继承。
先是Thread方法:
<span style="font-family:KaiTi_GB2312;font-size:14px;">public class MyThread extends Thread {
@Override
public void run () {
super.run();
System.out.println("MyThread");
}
}
public class RunTest() {
public static void main(String [] args) {
MyThread thread = new MyThread();
thread.start();
System.out.println("main运行结束");
}
}</span>
上面是基本的创建以及线程调用的方法(Start())。
运行的结果是
MyThread
main运行结束
或者顺序倒过来,都有可能,因为在多线程中,代码的运行结果和代码的执行顺序是无关的。
2.Runnable的使用
<span style="font-family:KaiTi_GB2312;font-size:14px;">public class MyRunnable implements Runnable {
@Override
public void run () {
super.run();
System.out.println("Runnable");
}
}
public class RunTest() {
public static void main(String [] args) {
Runnable run = new MyRunnable();
Thread thread = new Thread(run);
thread.start();
System.out.println("main运行结束");
}
}
</span>
这里看到Thread类在创建时传递了一个实现了Runnable的实例参数,,这就是Runnable的使用方式
在Thread类中,常用的几个构造方法有:
Thread()
Thread(Runnable target)
Thread(Runnable target,String name)
这里有一个概念是
非线程安全:主要是指对个线程对同一个对象中的同一个实例变量进行操作时,会出现的值被更改,值不同步的情况,进而影响程序的执行流程
Eg: 大象装冰箱的操作,分三步,打开冰箱门,装进去,关上。但是要是多线程,在你打开之后另一个线程给你关了,大象装哪?这就产生了非线程安全。
解决的办法是:在run方法前加上synchronized关键字,这样run方法的执行实际上是排队执行的。
synchronized 可以对任意对象和方法加锁,而加锁的这段代码称为“互斥区或临界区”。
三、多线程中的方法
1.线程启动 :start(),重新创建一个线程,并执行run方法。
如果在main中写MyThread.run(),则只能是当做普通的函数调用一样,和多线程没有什么关系。
2.currentThread()方法返回代码正在被哪个线程调用的信息。currentThread().getName();
3.isAlive()是否处于活动状态
4.getId()返回线程的唯一标识
5.停止线程 :可以用stop(). 但是这个是线程不安全的 。
因为强行停止的话一些清理工作可能还来不及处理,还有一个问题就是对锁定的对象进行了解锁,导致数据得不到同步处理,出现不一致的问题。
所以这种方法现在以及不要
推荐用interrupt(),这个方法不会终止一个正在运行的线程,而是会加入一些判断才停止。
6.interrupted():测试当前线程是否已经中断。
7、暂停和恢复:suspend()和resume()也会导致数据不同步问题,所以也不用了。
8.yield():放弃当前CPU资源,但是放弃的时间不确定。
9.设置优先级:setProperty().线程优先级有10个,1-10,可设置。
注意:线程的优先级具有继承性。
即:A线程启动B线程,则B线程的优先级和A一样。