码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程

时间:2019-03-13 21:37:42      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:targe   roi   1.2   final   对象锁   调度   obj   int   程序   

1、进程与线程的概念
    进程:操作系统中一个程序的执行周期
     线程:一个进程同时执行多个任务,通常来说,每个任务就称为一个线程
 
  1.1 与进程相比,线程更加“轻量级”,创建,撤销一个线程比启动一个进程开销要小的多。一个进程中的所有线程共享进程的所有资源。
 
  1.2 没有进程就没有线程,进程一旦终止,其内的线程也将不复存在
 
  1.3 进程是操作系统资源调度的基本单位,进程可以独享资源;线程需要依托进程提供资源,无法独立申请系统资源,是OS任务执行的基本单位。
2、Java多线程实现
  2.1 继承Thread类实现多线程
    java.lang.Thread是线程操作的核心类。新建一个线程最简单的方法就是直接继承Thread,而后覆写run()方法(相当于主线程的main()方法)。
 
    无论哪种方式实现多线程,线程启动一定调用Thread类提供的start()方法。
 
    线程的start()方法只能调用一次,多次会报java.lang.IllegalThreasStateException
 
    start() -> start0(JVM) -> 进行资源调度,系统分配(JVM) -> run(java方法)执行线程的具体任务。
 
2.2 实现Runnable接口来实现多线程
 
2.3继承Thread类与实现Runnable接口的关系
 
  I.Thread类与自定义线程类(实现了Runnable接口),是一个典型的代理设计模式。、
    Thread类负责辅助真实业务操作(资源调度,创建线程并启动)
    自定义线程类负责真实业务的实现(run方法具体做的事)
 
  II.使用Runnable接口实现的多线程程序类可以更好的描述共享的概念。
 
2.4实现Callable<V>实现多线程(juc)-->当线程有返回值时,只能实现Callable实现多线程。
  juc-JDK1.5新增的并发程序编程包
  java.util.concurrent.Callable<v>
 
  实现Callable而后覆写call()方法,有返回值
  V call () throws Exception;
 
  Future <V> 接口:
  V get() throws IntereuptedException, ExecutionException;
  取得Callable接口的返回值。
 
3.多线程常用操作方法
 
  3.1 线程的命名与取得
  I.通过构造方法在创建线程时设置线程名称。
    public Thread (String name)
 
    public Thread (Runnable target ,String name)
 
  II.取得线程名称
    public final String getName()
 
  III.创建线程后设置名称
 
    public final synchronized void setName(String name)
 
  3.2 线程休眠方法sleep()
    public static native void sleep (long millis) throws InterruptedException
 
    线程休眠:让当前线程暂缓执行,等到了预计时间后再恢复执行
 
    线程休眠会交出CPU ,但是不会释放锁。
 
  3.3 线程让步方法(yield()方法)
    暂停执行当前的线程对象,并执行其他线程。
 
    yield()方法会让当前线程交出CPU,同样不会释放锁。但是yield()方法无法控制具体交出CPU时间,并且yield()方法只能让拥有相同优先级的线程获得CPU机会。

  3.4 等待其他线程终止。 join()
    等待该线程终止。如果在主线程中调用该方法会让主线程休眠,让调用该方法的线程先执行完毕后,再恢复执行主线程。
    join()会释放对象锁
    join()方法只是对Object提供的wait()做了一层包装而已。
 
  3.5 线程停止
 
    3.5.1 设置标记位停止线程
    3.5.2 调用Thread类的stop()方法停止线程,该方法不安全已经被Deprecate(废弃)
    3.5.3 调用Thread类的interrupt()方法
      interrupt()方法只是将线程状态置为中断状态而已,他不会中断一个正在运行的线程。此方法只是给线程传递一个中断信号,程序可以根据信号判断是否需要终止。
     
      当线程中使用了wait sleep join 导致此线程阻塞,则interrupt()会在线程中抛出InterruptException,并且将线程的中断状态由true置为false 
 
  3.6 线程优先级
    线程优先级是指优先级越高越有可能先执行,但仅仅是有可能
 
    设置优先级
    public final void setproiority(int NewPortity)
 
    取得优先级
    public final int getPortity()
 
    MAX_PRIORITY = 10;
    NORM_PRIORITY = 5;
    MIN_PROIORITY = 1;
 
  主线程只是一个普通优先级而已
 
    线程具有继承性:只是继承优先级而已
    从A线程启动B线程,则B线程和A线程优先级一样。
 
  3.7 守护线程
 
    守护线程是一种特殊线程,又称为陪伴线程。java中一共两种线程:用户线程与守护线程。
    Thread类提供isDaemon()区别两种线程:返回false表示线程为用户线程;否则为守护进程。典型的守护线程就是垃圾回收线程
 
    只要当前JVM进程中任何一个用户线程没有结束,守护线程就在工作,只有当最后一个用户线程结束守护线程才会随着JVM一同停止工作。
 
    Thread提供setDaemon()将用户线程设置为守护线程。

Java多线程

标签:targe   roi   1.2   final   对象锁   调度   obj   int   程序   

原文地址:https://www.cnblogs.com/yishengPan/p/10526215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!