Java多线程一(基础及线程状态转换)

2013-03-17  来源:本站原创  分类:Java一箩筐  人气:1 

Java实现多线程的方法有两种,一是继承Thread类、二是实现Runnable接口。

一、继承Thread类

public class ThreadTest extends Thread {
    @Override
    public void run() {
        System.out.println("this thread name is:"+Thread.currentThread().getName());
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        ThreadTest t = new ThreadTest();
        t.setName("myTestThread");
        t.start();
    }

}
  • 继承Thread后需要覆盖run()来实现自己的业务逻辑;
  • 一个线程的启动是调用start方法,而不是run方法;
  • 当给线程设置名称的时候,我们就可以得到设置的线程名称。

二、实现Runnable接口

public class RunnableTest implements Runnable {
    @Override
    public void run() {
        System.out.println("this thread name is:"+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
        RunnableTest r = new RunnableTest();
        Thread t = new Thread(r);
        t.start();
    }
}
  • 实现Runnable接口需要实现run方法,在run方法里面实现自己的业务逻辑;
  • 实现Runnable接口的类自己不能启动线程,需要将此类的对象传递给Thread,由Thread的start方法启动。
  • main函数是java运行启动的入口,它是由一个name叫main线程调用的;如果一个线程没有专门设置名称,程序会默认的将名称设置为Thread-num,num是从0开始累加的数字。

三、线程的状态转换

Java多线程一(基础及线程状态转换)

  • 当一个线程执行了start方法后,不代表这个线程就会立即被执行,只代表这个线程处于可运行的状态,最终由OS的线程调度来决定哪个可运行状态下的线程被执行。
  • 一个线程一次被选中执行是有时间限制的,这个时间段叫做CPU的时间片,当时间片用完但线程还没有结束时,这个线程又会变为可运行状态,等待OS的再次调度;在运行的线程里执行Thread.yeild()方法同样可以使当前线程变为可运行状态。
  • 在一个运行中的线程等待用户输入、调用Thread.sleep()、调用了其他线程的join()方法,则当前线程变为阻塞状态。
  • 阻塞状态的线程用户输入完毕、sleep时间到、join的线程结束,则当前线程由阻塞状态变为可运行状态。
  • 运行中的线程调用wait方法,此线程进入等待队列。
  • 运行中的线程遇到synchronized同时没有拿到对象的锁标记、等待队列的线程wait时间到、等待队列的线程被notify方法唤醒、有其他线程调用notifyAll方法,则线程变成锁池状态。
  • 锁池状态的线程获得对象锁标记,则线程变成可运行状态。
  • 运行中的线程run方法执行完毕或main线程结束,则线程运行结束。

四、线程同步各个方法的区别

  • Thread.yield()当前运行的线程变成可运行状态。
  • t2.join() 使得当前线程处于阻塞状态直到t2线程执行完毕。
  • Thread.sleep()使得当前线程处于阻塞状态直到sleep的时间结束。
  • wait、notify、notifyAll方法是Object类的方法,其调用环境必须有synchronized的同步块中调用,否则会抛java.lang.IllegalMonitorStateException异常。
相关文章
  • Java多线程一(基础及线程状态转换) 2013-03-17

    Java实现多线程的方法有两种,一是继承Thread类.二是实现Runnable接口. 一.继承Thread类 public class ThreadTest extends Thread { @Override public void run() { System.out.println("this thread name is:"+Thread.currentThread().getName()); } /** * @param args */ public static void

  • java中的线程状态转换 2014-03-12

    java中的线程状态转换: 看到一张舒服的java线程状态转换图: 介绍那几个重要的api: t.start(): 启动线程,此时t线程进入可运行状态(就绪状态),不要以为start()完就执行run方法了: t.yield(): t线程主动让出cpu分片,进入就绪状态(就绪状态:即指该线程只因为缺少cpu资源才进入的状态); t.sleep(): t线程进入阻塞状态(不会释放任何对象锁),睡眠完之后继续进入就绪状态: t2.join(): t线程进入阻塞状态(不释放任何对象锁),等待t2线程执

  • Java多线程系列--"基础篇"01之 基本概念 2015-05-09

    多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容,是对"JDK中新增JUC包"之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), notify()等接口:Thread类中的接口:synchronized关键字. 注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到Java中的. 在进入后面章节的学习之前,先对了解一些多线程的相关概念. 线

  • java多线程编程之向线程传递数据的三种方法 2014-01-11

    在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据 在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据.本文就

  • java多线程学习总结之四:线程的同步 2013-03-11

    线程的同步是保证多线程安全访问竞争资源的一种手段.对于同步,在具体的Java代码中需要完成一下两个操作:把竞争访问的资源标识为private:同步哪些修改变量的代码,使用synchronized关键字同步方法或代码. 线程退出同步方法时将释放掉方法所属对象的锁,但还应该注意的是,同步方法中还可以使用特定的方法对线程进行调度.这些方法来自于java.lang.Object类. void notify() 唤醒在此对象监视器上等待的单个线程. void notifyAll() 唤醒在此对象监视器上等

  • java多线程编程之从线程返回数据的两种方法 2014-11-07

    从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪 一.通过类变量和方法返回数据 使用这种方法返回数据需要在调用start方法后才能通过类变量或方法得到数据.让我们先来看看例程2-13会得到什么结果. package mythread; public class MyThread extends Thread { private String value1; private String value

  • java多线程学习总结之三:线程间的协作 2013-03-11

    这里主要研究Object的方法wait().notify()和notifyAll()来安全的实现进程间的握手.此外java se5并发类库提供了具有await()和signal()方法的Condition对象.注意wait().notify()和notifyAll()方法只能在同步控制方法或同步控制块里调用. wait()方法有两种形式.第一种为接受毫秒数作为参数,含义与sleep()方法里参数的意思相同.但与sleep()不同的是,对于wait()而言: 1)在wait期间对象锁是释放的 2)

  • java多线程程序设计三.后台线程(守护线程) 2013-11-27

    1.守护线程旨在后台为运行着的程序提供一般化的服务,但是它并不是属于程序的一部分,因此当所有的非后台线程结束之后,程序也就会结束这个时候就会杀死所有的守护线程,但是反过来却不是这样子,比如说: package multiThread; import java.util.concurrent.TimeUnit; public class SimpleDaemons implements Runnable { public void run(){ while(true){ try { TimeUni

  • Java多线程编程(4)-守护线程Daemon Thread 2015-03-26

    Java线程类型有两种,分别是用户线程(User Thread) 和 守护线程(Daemon Thread). 举个场景,比如我们在编写文档,有线程在处理输入,有线程在后台默默替我们检查语法:处理输入的是用户线程,检查语法的是守护线程.当我们退出文档,即所有的用户线程都结束了,守护线程也会随之退出.常见的守护线程比如垃圾回收线程. 通过thread.setDaemon(true),就可以把一个线程指定为守护线程,这是两种线程在编码中唯一的区别. 使用守护线程时有几个注意事项: 1. setDae

  • 线程状态的转换 2014-05-22

    一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态.当start()方法调用时,线程首先进入可运行状态.在线程运行之后或者从阻塞.等待或睡眠状态回来后,也返回到可运行状态. 3.运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态.这也是线

  • java多线程编程之捕获子线程异常示例 2014-12-05

    java多线程程序中所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.但是无法避免的是unchecked exception,也就是RuntimeException,当抛出异常时子线程会结束,但不会影响主线程 通过try catch是无法捕获子线程异常的,Thread对象提供了setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法用来

  • java多线程 2014-12-11

    一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. "同时"执行是人的感觉,在线程之间实际上轮换执行. 二.Java中的线程 在J

  • java多线程和并发包入门示例 2015-02-17

    这篇文章主要写了java多线程的使用方法和java并发包简单入门的示例,大家可以参考使用 一.java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题. java多线程,传统创建线程的方式有两种. 1.继承自Thread类,覆写run方法. 2.实现Runnable接口,实现run方法. 启动线程的方法都是调用start方法,真正执行调用的是run方法. 参考代码如下: package com.jack.thread; /** * 线程简单演示例子程序 * *

  • 一张图让你看懂JAVA线程间的状态转换 2013-08-01

    线程间的状态转换: 1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 . 3. 运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码. 4. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂

  • Java多线程:线程状态 2015-03-26

    一. 线程状态类型 1. 新建状态(New):新创建了一个线程对象. 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种: (一).等待阻塞:运行的线程执行

  • JAVA多线程-基础Synchronized 2012-11-07

    后篇: JAVA多线程-基础Lock Condition 并发集合 JAVA多线程-交互计算 Future Callable Promise 读懂代码,首先要懂得thread的几个状态,以及它们之间的转换. Java thread的状态有new, runnable, sleep, blocked,wait, interrupt, dead. t = new Thread() -> new t.start() -> runnable Synchronized(this) or lock.lock

  • JAVA多线程和并发基础面试问答 2013-11-05

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观点) Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻

  • JAVA多线程和并发基础面试问答(翻译) 2014-12-02

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题 Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中

  • Java多线程和并发基础面试回答 2014-02-19

    Java多线程面试问题 1 进程和线程之间有什么不同 一个进程是一个独立self contained的运行环境,它可以被看作一个程序或者一个应用.而线程是进程中的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源 2 多线程编程的好处是什么 在多线程程序中,多个线程被并发执行以提高程序的效率,cpu不会因为某个线程需要等待而进入空闲状态.多个线程共享堆内存heap memory,因此创建多个线

  • Java线程状态 2015-01-14

    Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡 5 个状态.一个 Java 线程总是处于这 5 个生命周期状态之一,并在一定条件下可以在不同状态之间进行转换 . 创建状态 (New Thread) 在 Java 语言中使用 new 操作符创建一个线程后,该线程仅仅是一个空对象,它具备了线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态. 就绪状态 (Runnable) 使用 start() 方法启动一个线程后,系统为该线程分配了除 CPU 外的所需资源,使该线程处于就绪