多线程
线程与进程的区别
进程:进程指的是内存中一个运行的应用,一个进程有多个或一个进程,通常是xxx.exe程序,进程与进程之间资源不共线
线程:一个进程包含一个或多个线程,表示线程之间可以同时进行,线程与线程之间资源可以共享
多线程的好处:多线程可以并发执行,如果没有多线程,只能一个运行结束之后再进行下一个任务,不符合生活实际要求
多线程的调度情况:cpu进行调用,cpu会给线程分配时间片(CPU给线程的运行时间,一般几毫秒到几时毫秒不等),之间是抢占式的,谁抢到时间片,谁执行
并发与并行
并发:某时间段内同时执行
并行:同一个时间同时执行
主线程main
一个简单的Java程序就已经拥有两个线程,一个是主线程(main),一个是堆的垃圾回收(gc)。
Thread实现线程创建与启动
public class Demo{
public static void main(String args[]){
new ThreadDemo().start();
//java 1.8写法
new Thread(()->{
public void run(){
//线程主体
}
}).start();
}
}
class ThreadDemo extends Thread{
public void run(){
//...线程的主体
}
}
Runnable实现线程的创建与启动
public class Demo{
public static void main(String args[]){
RunnableDemo rd = new RunnableDemo();
new Thread(rd).start();
}
}
class RunnableDemo implements Runnable{
public void run(){
//...线程的主体
}
}
Thread与Runnable的区别
Thread是类而Runnable是接口,Thread实现了Runnable接口,如果实现了接口也要使用Thread进行启动
Runnable更容易实现资源贡献,能多个线程同时处理一个资源
对象实现了Thread后不能再次继承,使用了接口从设计上更加好
线程的启动
启动一个新的线程不能使用run()方法(run方法不能开辟线程),只能使用start方法
注:一个线程对象,start方法只能调用一次
join方法
当前线程停止让对应的线程优先执行
sleep方法
让线程阻塞
线程优先级
设置线程优先级:setPriority(int x)
获得线程优先级:getPriority
后台线程
setDaemon(true)设置为后台线程,前台线程都死亡后,后台线程自动死亡
必须在start()方法之前调用
获得线程的名字
在继承Thread类里使用this.getName()进行获取
在实现了Runnable接口里使用Thread.currentThread().getName()进行获取
同步代码块
synchronized(同步锁){
}
同步锁内容里写this表示当前对象只能有一份
同步方法
使用synchronized修饰的方法叫做同步方法
synchronized public void doWork(){
}
如果方法使用static修饰的话同步锁就是当前类对象,如果方法不是用static修饰同步锁就是this
synchronized的优略势
StringBuffer和StringBuilder的区别
ArrayList和Vector的区别
HashMap和HashTable的区别
前者都是使用synchronized修饰的所以比较安全,后者没有使用synchronized修饰所以不怎么安全
使用synchronized修饰性能比较低下、比较耗费资源,但是比较安全
什么时候线程不安全
多线程的时候
出现非原子性操作
共享同一个资源
如果解决线程不安全
同步代码块
同步方法
同步锁对象