githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/src/main/java/com/kawa/thread

1.实现方式

  1. 1.继承Thread (重写run()方法,通过start()方法来执行线程)
  2. 2.实现Runnable接口
  3. 3.使用匿名内部类方式创建

2.多线程常用API

常用线程api方法  
start() 启动线程
currentThread() 获取当前线程对象
getID() 获取当前线程ID Thread-编号 该编号从0开始
getName() 获取当前线程名称
sleep(long mill) 休眠线程
Stop() 停止线程,
常用线程构造函数  
Thread() 分配一个新的 Thread 对象
Thread(String name) 分配一个新的 Thread对象,具有指定的 name正如其名。
Thread(Runable r) 分配一个新的 Thread对象
Thread(Runable r, String name) 分配一个新的 Thread对象

3.多线程的运行状态

新建状态

  1. new Thread(r),线程还没有开始运行,此时线程处在新建状态。

就绪状态

  1. 当线程对象调用start()方法即启动了线程,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。处于就绪状态的线程并不一定立即运行run()方法,
    线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。

运行状态

  1. 当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.

阻塞状态

  1. 线程运行过程中,可能由于各种原因进入阻塞状态
       1>线程通过调用sleep方法进入睡眠状态
       2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者
       3>线程试图得到一个锁,而该锁正被其他线程持有
       4>线程在等待某个触发条件

死亡状态

  1. 有两个原因会导致线程死亡:
     1) run方法正常退出而自然死亡,
     2) 一个未捕获的异常终止了run方法而使线程猝死。
    为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true
    如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.

4. join()方法作用

  1. join作用是让其他线程变为等待,
  2. thread.join();// 让其他线程变为等待,直到当前t1线程执行完毕,才释放。
  3. thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程AJoin()方法,直到线程A执行完毕后,
    才会继续执行线程B

5.线程同步

5.1 synchronized

5.1.1 同步方法

  1. 即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。
    在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。

5.1.2 同步代码块

  1. 即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如:
  2. synchronized(object){....}

注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。

5.2 wait与notify
  1. wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
  2. 这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
  3. 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
  4. 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
  5. 如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
  6. 注意:一定要在线程同步中使用,并且是同一个锁的资源
5.3 wait 与sleep区别
  1. 1.wait 用于同步中,可以释放锁的资源
  2. sleep不会释放锁的资源
  3. 2.wait需要notify才能从休眠状态变为运行状态
  4. sleep时间到期,从休眠状态变为运行状态

6. JDK1.5 Lock锁

6.1 Lock写法

  1. Lock lock = new ReentrantLock();
  2. lock.lock();
  3. try{
  4. //可能会出现线程安全的操作
  5. }finally{
  6. //一定在finally中释放锁
  7. //也不能把获取锁在try中进行,因为有可能在获取锁的时候抛出异常
  8. lock.ublock();
  9. }

6.2 Lock 接口与 synchronized关键字的区别

  1. Lock 接口可以尝试非阻塞地获取锁 当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。
  2. Lock 接口能被中断地获取锁 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。
  3. Lock 接口在指定的截止时间之前获取锁,如果截止时间到了依旧无法获取锁,则返回。

6.3 Condition用法

  1. Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能。
  2.  
  3. Condition condition = lock.newCondition();
  4. res. condition.await(); 类似wait
  5. res. Condition. Signal() 类似notify

JAVA多线程(一) Thread & Runnable的更多相关文章

  1. java多线程创建-Thread,Runnable,callable和threadpool

    java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...

  2. Java 多线程实现接口Runnable和继承Thread区别(转)

    Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...

  3. Java 多线程(1)-Thread和Runnable

    一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...

  4. java多线程(二)-Runnable和Thread

    Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...

  5. Java多线程中的Runnable和Thread

    摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...

  6. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  7. java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程

    常用方法: boolean isAlive() 测试此线程是否存活. boolean isDaemon() 测试此线程是否为守护程序线程. static void sleep?(long millis ...

  8. java:多线程基础之Runnable、Callable与Thread

    java.lang包下有二个非常有用的东西:Runnable接口与Thread类,Thread实现了Runnable接口(可以认为Thread是Runnable的子类),利用它们可以实现最基本的多线程 ...

  9. Java 多线程之 Thread 类 和 Runnable 接口初步使用

    目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...

随机推荐

  1. Effective C++ 条款二 用编译器替换预编译器

    /************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...

  2. JQUERY多选框,单选框,检查选中的值

    var str=""; $(":checkbox:checked").each(function(){ if($(this).attr("checke ...

  3. js对象的属性问题

    ES6之前js的对象的属性只能是字符串, <html> <head> <script type="text/javascript"> var a ...

  4. centos 安装php7 memcached扩展

    在使用下面这种方式安装php7 memcached扩展时,先要安装好memcached服务器yum -y install php70w-pecl-memcached

  5. LeetCode(26)题解:Remove Duplicates from Sorted Array

    https://leetcode.com/problems/remove-duplicates-from-sorted-array/ Given a sorted array, remove the ...

  6. MapReduce算法形式五:TOP—N

    案例五:TOP—N 这个问题比较常见,一般都用于求前几个或者后几个的问题,shuffle有一个默认的排序是正序的,但如果需要逆序的并且暂时还不知道如何重写shuffle的排序规则的时候就用以下方法就行 ...

  7. Scaling with Microservices and Vertical Decomposition

    Scaling with Microservices and Vertical Decomposition – dev.otto.de https://dev.otto.de/2014/07/29/s ...

  8. Java,多个线程对同一个数据源的访问

    当多个线程对同一个数据源进行访问时,应对线程同步或加锁.为何?举个简单的例子:有一个共享的数据源dataSource,其值为0.有两个线程,Thread1和Thread2.Thread1的任务是将da ...

  9. Flume 和 kafka的区别和对比

    定义: Flume:是Cloudera提供的一个分布式的海量日志采集.聚合和传输的系统: Kafka:是一种高吞吐量的分布式发布订阅消息系统: 各特点: 场景: Flume主要是和HDFS\HBase ...

  10. linux网络配置及IP绑定

    在学习时,参考了这篇文章:http://blog.csdn.net/collection4u/article/details/14127671:在这篇文章中作者讲述了VMware中虚机的三种网络模式: ...