Java线程问题

来源:互联网 发布:windows访问samba拒绝 编辑:程序博客网 时间:2024/04/29 16:03

1.什么是Java线程

      线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

2.线程和进程有什么区别

     线程是进程的子集,一个进程有多个线程,多个线程共享进程的内存空间,每条线程执行不同的任务,不同

     的进程使用不同的内存空间。

3.实现线程的方法

      继承Thread类,实现runnable接口。Java不能多重继承,但是能实现多个接口,故实现runnable接口。

4.Thread 类中的start() 和 run() 方法有什么区别

       start()方法将当前线程纳入线程调度,使当前线程可以开始并发运行,也就是就绪状态。当线程获取时间片段后

       会自动执行run()方法,也就是运行状态。

5.sleep和wait有什么区别

     sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,

     到时后会自动恢复。调用sleep不会释放对象锁。

     wait是Object类的方法,线程对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此

     对象发出 notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁,也就是处于就绪状态;

6.并发原理:(也就是所谓的异步)

     多个线程同时运行只是我们感官上的一种表现。事实上线程是并发运行的,OS将时间划分为很多时间片段,尽可能

    均匀分配给每一个线程,获取时间片的线程被CPU运行,而其他线程等待。所以微观上是走走停停,宏观上是都在

    运行,这种现象叫并发,但不是绝对意义上的“”同时发生“”;

7.在Java当中,线程通常有五种状态,创建,就绪,运行,阻塞和死亡。

    创建:生成线程对象,并没有调用该对象的start()方法,这时线程处于创建状态;

    就绪:调用start()方法后,纳入线程调度,该线程进入就绪状态;从等待或者睡眠中回来之后,也会处于就绪状态;

    运行:线程调度程序将就绪状态的线程设置为当前线程,此时线程进入运行状态,开始运行Run()中代码;

    阻塞:线程正在运行的时候,被暂停。sleep()、suspend()、wait()等都可导致线程阻塞;

    死亡:如果一个线程在run()方法结束,或者调用stop()方法,该线程就会死亡;

 8.sleep()方法:该方法会使当前线程进入阻塞状态毫秒数,然后当前线程会重新进入Runnable(就绪)状态,该

  方法会抛出InterruptException。

  yield()方法:该方法使当前线程主动让出CPU时间片段回到Runnable状态,等待分配时间片。

  join()方法:用于等待当前线程结束,执行另一个线程,会抛出InterruptException。

 9.多线程的并发安全问题:

  多个线程并发读写同一个临界资源会发生多线程并发安全问题;

10.线程同步(就是为了解决多线程并发安全问题)

  synchronized关键字 给代码加锁或者给方法加锁;synchronized关键字是Java中的同步锁;

11.锁机制:Java提供了一种内置的锁机制来支持原子性。

12.什么是线程池以及线程池的作用和使用:

   定义:线程池主要是通过控制执行的线程的的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面

   取出任务执行。

   作用:减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行线程的数量,防止消耗过多内存。

   使用:ExecutorService线程池接口

   ExecutorService pool=Executors.常见线程池

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 0