多线程

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();

    }

}

 

原文链接:加载失败,请重新获取