Java多线程

来源:互联网 发布:如何成为数据分析师 编辑:程序博客网 时间:2024/06/06 21:40

线程与进程

  • 什么是进程

进程就是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。

  • 什么是线程

进程中所包含的一个或多个执行单元称为线程

进程就是我们的独立的应用程序,当系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。进程本身拥有一个私有的虚拟地址空间,相互

之间是不能相互通信的,但是我们可以通过让不同进程去访问计算机中的共享空间或着外设,达到进程间通信的目的。

  • 什么是并发

多个线程或进程同时执行只是我们感官上的一种表现。事实上进程或线程之间是并发执行的。操作系统(OS)将时间片尽可能均匀的划分给不同的进程或者线

程,在程序运行时,获得时间片的线程得以执行,而未获得的线程则暂停等待,程序运行的这种走走停停的现象称为并发。

  • 线程的状态
  1. New:当我们创建一个线程时,该线程没有纳入线程调度,其处于一个new状态
  2. Runnable:当调用线程的start方法后,该线程纳入线程调度的控制,其处于一个可运行状态,等待分配时间片段并发执行
  3. Running:当该线程被分配到了时间片段后其被CPU运行,该线程处于running状态
  4. Blocked:当线程在运行过程中可能会出现阻塞现象
  5. Dead:当线程的任务全部运行完毕,或在运行过程中抛出了一个未捕获的异常,线程结束,等待回收


Java中创建线程

  • 继承自Thread类

class ToRun extends Thread{    @Override    public void run() {        //自己的逻辑代码    }}
  • 实现Runnable接口
class ToRun2 implements Runnable{    @Override    public void run() {        //自己的逻辑代码    }}
  • 使用内部类创建线程
  • 继承Thread方式

        Thread t2 = new Thread(){            @Override            public void run() {                super.run();            }        };

  • Runnabel方式

        Thread t1 = new Thread(new Runnable() {            @Override            public void run() {            }        });

线程优先级

线程的优先级被划分为10级,值分别为1-10,其中1最低,10最高。线程提供了3个常量来表示最低、最高和默认优先级:

    /**     * The minimum priority that a thread can have.     */    public final static int MIN_PRIORITY = 1;   /**     * The default priority that is assigned to a thread.     */    public final static int NORM_PRIORITY = 5;    /**     * The maximum priority that a thread can have.     */    public final static int MAX_PRIORITY = 10;

默认的线程的优先级与创建它的线程的优先级相同

public final void setPriority(int newPriority)更改线程的优先级。 

不能简单的认为优先级高的线程一定优先执行,高优先级的线程只是建议CPU优先执行高优先级的线程,提高该线程执行的概率,至于CPU具体怎末执行就不是我们能够干预的。

守护线程

  • 将线程设置为守护线程

public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。该方法必须在启动线程前调用。 

守护线程的特点是:当进程中只剩下守护线程时,所有的守护线程将被强制终止。(GC是守护线程)

线程阻塞

  • sleep()方法(调用此方法要捕获异常)

public static void sleep(long millis)                  throws InterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。 

sleep()是让调用它的线程阻塞固定的时间,在哪个线程中调用,哪个线程阻塞。

  • sleep和wait()的区别:
    • 这两个方法来自不同的类,sleep()方法来自Thread类,wait()来自Object类
    • sleep()释放资源,但不释放锁;wait()释放资源释放锁。
    • 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
原创粉丝点击