java多线程基础
多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要。
一、什么是线程
线程是程序执行的最小单元,一个程序最少有一个线程。
一个应用也是一个线程,主方法是他的主线程,一个程序运行时会有最少两个线程,主线程和gc。
二、线程的三种状态
新建 new,new出一个线程处于新建状态。
就绪 runnable,start()进入就绪状态,开始准备抢占cpu资源。
运行 running,cpu正在执行线程。
阻塞 blocked,等待阻塞wait(),同步阻塞sync失败,其他 seleep()、join()。
死亡 dead,线程run结束或者因为异常退出。
借鉴一下比较经典的线程的生命周期图。

三、如何创建一个线程
(1)继承thread类
继承thread类要重写run()方法,通过调用start()方法启动线程。
(2)实现runnable接口
实现接口要实现run()方法,然后定义一个线程A,把该实现类作为线程A构造方法的参数,A.start()启动线程。
start()方法在启动线程的时候会调用run(),还会调用start0(),用来调度cpu资源, 另外 Thread类也是实现run方法的。
区别:推荐使用实现runnable接口,一是由于不受java单继承多实现的限制,二是方便实现数据共享。
package com.peoplemanager;
public class Demo1 {
public static void main (String args[]){
//第一种方式
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
//第二种方式
MyThreadImpl mt = new MyThreadImpl();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThreadImpl implements Runnable{
private int ticket = 5;
public void run(){
synchronized (this) {
for(int i=20;i>=5;i--){
if(ticket>0){
try {
MyThread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ticket--);
}
}
}
}
}
class MyThread extends Thread{
private int ticket = 5;
public void run(){
synchronized (this) {
for(int i=20;i>=5;i--){
if(ticket>0){
try {
MyThread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ticket--);
}
}
}
}
}
四、同步和锁
实现同步的方式:加锁,将代码卸载sync(){}代码块中,锁住了,别的线程不能运行,只能等他先运行完。
多个线程访问同一资源要考虑线程的同步,同步会影响程序的性能,但是会提升数据的安全性,过多的同步有可能出现死锁。
五、线程安全
java容器实现线程安全的两种思路:

浙公网安备 33010602011771号