1 java多线程的概念
进程:是一个容器变量内存、数据、代码流;但是进程静态概念,不占用cpu执行,一个进程可以包含多个线程,而线程真正拥有cpu并执行;
在一个进程中包含的多个线程,轮流拥有CPU时间片得到执行机会,由于CPU时间片运行速度快,多个线程并发执行特点;
2 java实现多线程编程方式
java实现多线程基本有两种;在jdk1.5时提出JUC;
java中基本实现多线程编程的方式
2.1 实现java.lang.Runnable接口
A: 编写自定义线程实现方法,特点实现Runnable接口并重写run方法;
class H1 implements Runnable{
@Override
public void run() {
try {
//新线程执行代码
for (int i = 0; i <10 ; i++) {
System.out.println("h1 thread...."+i);
//使当前线程让出CPU执行的时间片
// Thread.sleep(毫秒);
Thread.sleep(700);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
B: 创建线程实现代码对象,根据该对象创建一个线程对象
H1 h1=new H1();
//创建一个线程对象
Thread t=new Thread(h1);
C: 启动线程
t.start();
2.2 继承java.lang.Thread类
class Demo03 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getId());
}
}
public class Thread03 {
public static void main(String[] args) {
//相当于直接创建线程对象
Thread t1=new Demo03();
Thread t2=new Demo03();
t1.start();
t2.start();
}
}
3 多线程的生命周期
java多线程操作方法
线程对象.start(): 启动线程对象;
Thread.sleep(): 线程休眠指定毫秒数,并让出CPU;
//唤醒线程对象ta
ta.interrupt();
ta.stop() 杀死线程对象ta
Thread.yield(); 让当前线程暂时让出CPU,进入就绪状态
join :将两个线程合并一个线程
4 线程共享变量
4.1 控制线程共享变量可见关键字volatile
Java提供了volatile关键字来保证可见性。
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
例如:
4.2 使用同步技术
java多线程中可以有同步方法和同步块
面试题:
ConcurrentHashMap和Hashtable区别?
答:ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对
与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用“锁分段”
机制替代 Hashtable 的独占锁。进而提高性能。
4.3 消费者和生产者模式
线程间通信机制
A:锁死现象?
面试:死锁条件是什么?
答:理解产生死锁的必要条件--以下四个条件同时具备:互斥条件、不可抢占条件、占有且申请条件、循环等待条件。
死锁代码?
public class DeadLock implements Runnable{
static Object objA=new Object();
static Object objB=new Object();
@Override
public void run() {
String tname = Thread.currentThread().getName();
if(tname.equals("t1")){
synchronized (objA){
System.out.println("t1锁定A....");
synchronized (objB){
System.out.println("t1锁定B....");
}
}
System.out.println("t1结束...");
}else{
synchronized (objB){
System.out.println("t2锁定B....");
synchronized (objA){
System.out.println("t2锁定A....");
}
}
System.out.println("t2结束...");
}
}
public static void main(String[] args) {
DeadLock dk=new DeadLock();
Thread t1=new Thread(dk,"t1");
Thread t2=new Thread(dk,"t2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.start();
t2.start();
}
}