Thread 线程

1.线程的状态

java的线程是通过java.lang.Thread类来实现的。

1.1创建

调用完构造函数后,线程就为创建状态。 

1.2就绪

调用start()方法后,所处的状态。

1.3运行

正常的运行。

1.4阻塞

资源等待的状态。

1.5死亡

run()方法执行完毕后,该线程就死掉了。注意不能再次调用此线程的start()方法。

2.常用函数

java.lang.Thread.Thread(Runnable target, String name)

创建新线程,并指定线程的名字。

java.lang.Thread.Thread(ThreadGroup group, Runnable target, String name)

创建新线程,并指定线程的名字和所属线程组。

void java.lang.Thread.start()

让线程置于就绪状态,等待操作系统调度。

问:它与run()有什么区别呢?

答:start()是异步的,会新起一个线程,在新的线程中调用run()方法。直接调用run()就是在当前线程中执行同步的方法。

Thread java.lang.Thread.currentThread()

返回当前线程。

String java.lang.Thread.getName()
返回线程名称。

boolean java.lang.Thread.isDaemon()

是否是一个后台线程。

void java.lang.Thread.yield()

告诉操作系统此时可以进行线程切换。使用此方法有助于暴露线程不安全问题导致的异常现象。

java.lang.Thread.sleep(long millis, int nanos)

当前线程睡眠(millis 毫秒+nanos纳秒)。此方法会被TimeUnit这个枚举类型调用,可见:void java.util.concurrent.TimeUnit.sleep(long timeout)。

void java.lang.Thread.join(long millis) 

此函数是同步的,当线程结束或等待达到超时时间后返回。

3.线程中断

Thread 的stop()与destory()方法被废弃,直接调用会有异常,见下:

 @Deprecated
    public void destroy() {
        throw new NoSuchMethodError();
    }

所以现在你不能暴力地中断一个线程,只能让线程自己来配合。

void java.lang.Thread.interrupt()

Thread类有一个布尔字段isInterrupted,用来标记自己是否被中断。调用此方法会置这个变量为true。如果此线程被join()、wait()、sleep()方法阻塞,那么调用interrupt()方法时会引起InterruptedException异常。

boolean java.lang.Thread.isInterrupted()

返回上面说的isInterrupted布尔变量。

3.1 例子

run()里面的whilr(true) 被 替代,这样更优雅。一旦run()函数执行完毕,一个线程也就完成了它的使命。

@Override
public void run() {
	while(true){
		//do something
	}
}
//above and below is a contrast.
@Override
public void run() {
	while(!Thread.currentThread().isInterrupted()){
		//do something
	}
}

4.线程相关接口

4.1 Runnable

java.lang.Runnable

它是一个接口,有run()方法。

接口定义见下:

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

想要被作为新线程运行的类需要实现Runnable接口,在run()函数中完成待处理的任务。

1.定义类A继承接口Runnable,并实现函数 void run();

2.用A的对象构造Thread对象。然后调用start()函数。

注意:start()函数为异步调用,立即返回啦。

4.2 Callable

java.lang.Callable

它是一个接口,有call()方法,用于具有返回值的多线程任务。

接口定义见下。

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

例子:

4.3 Future

java.util.concurrent.Future<E>
Future对象代表着一个异步操作的结果。调用此对象的isDone()方法来查询任务是否已完成,它是异步的。调用get()方法获取线程执行结果,它是同步的,在结果准备就绪前一直阻塞。

它的接口定义见下:

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}
时间: 2024-10-09 05:13:07

Thread 线程的相关文章

thread-java Thread线程tickets问题

问题描述 java Thread线程tickets问题 刚学thread,怎么控制台输出会有重复的数目,求大神解答 public class Ticket implements Runnable{ public static int count = 5; private String name; public void run(){ for(int i=0;i<=4;i++){ try{ Thread.sleep(1000); }catch(Exception e){ e.printStackT

Android中断并重启一个Thread线程的简单方法

这里简单的总结下(大概思路,没调试,可能会有错!): MyThread.java pulbic class MyThread implemets Thread{ @overide public void run{ while(!Thread.interrputed()){ } } } xxx.java Thread mThread = new MyThread(); public static void startThread(){ mThread = new MyThread(); mThre

在Android中使用Handler和Thread线程执行后台操作

大家都知道,在PC上的应用程序当需要进行一些复杂的数据操作,但不需要界面UI的时候 ,我们会为应用程序专门写一个线程去执行这些复杂的数据操作.通过线程,可以执行例如 :数据处理.数据下载等比较耗时的操作,同时对用户的界面不会产生影响.在Android应用 程序开发中,同样会遇到这样的问题.当我们需要访问网络,从网上下载数据并显示在我们 的UI上时,就会启动后台线程去下载数据,下载线程执行完成后将结果返回给主用户界面线 程. 对于线程的控制,我们将介绍一个Handler类,使用该类可以对运行在不同

你知道Thread线程是如何运作的吗?

[引自CoorChice的博客]背景介绍 我们在Android开发过程中,几乎都离不开线程.但是你对线程的了解有多少呢?它完美运行的背后,究竟隐藏了多少不为人知的秘密呢?线程间互通暗语,传递信息究竟是如何做到的呢?Looper.Handler.MessageQueue究竟在这背后进行了怎样的运作.本期,让我们一起从Thread开始,逐步探寻这个完美的线程链背后的秘密. 注意,大部分分析在代码中,所以请仔细关注代码哦! 从Thread的创建流程开始 在这一个环节,我们将一起一步步的分析Thread

Java 里的thread (线程)简介

在Java里 thread 就是线程的意思. 说到线程的概念, 自然离不开另外两个词: 程序和进程. 从最基本的程序讲起: 一. 什么是程序(Program) 所谓程序, 就是1个严格有序的指令集合. 程序规定了完成某一任务时,计算机所需要做的各种操作, 以及操作的顺序. 1.1 单道程序运行环境 所谓单道程序环境就是指, 计算机除了操作系统之外, 只允许运行1个用户程序. 以前的DOS系统就是1个典型的单道程序运行环境. 单道程序有如下特点: 1. 资源的独占性: 任何时候, 内存内只有1个用

java中thread线程start和run的区别_java

最近看到一个题目,代码如下: 复制代码 代码如下: public static void main(String args[]) {Thread t = new Thread() {public void run() {pong();}}; t.run();System.out.println("ping");}static void pong() {System.out.println("pong");} 问,结果会输出什么? 我运行了很多次,结果都是pong p

thread线程栈size及局部变量最大可分配size【转】

转自:http://blog.csdn.net/sunny04/article/details/46805261 版权声明:本文为博主原创文章,未经博主允许不得转载. 进程是操作系统的最小资源管理单元, 线程是操作系统最小的执行单元. 一个进程可以有多个线程, 也就是说多个线程分享进程的资源,包括栈区,堆区,代码区,数据区等. [cpp] view plain copy sundh@linhaoIPTV:~$ ulimit -a   core file size          (blocks

1.10. Thread 线程

1.10.1. 实现异步执行 public void testThread() throws Exception { try { Thread sendmail = new Thread(new Runnable() { @Override public void run() { // Sendmail log.info("Sendmail OK"); } }); sendmail.setName("sendmail"); sendmail.start(); } c

java-Java中线程的问题:明明是同一个thread对象,但是threadLocal不是同一个

问题描述 Java中线程的问题:明明是同一个thread对象,但是threadLocal不是同一个 package hub; /*为啥不同线程中的ThreadLocal是互相独立的. 明明是同一个thread对象 打印出来的结果 在主线程里面是var2 ,在thread线程中是var1 */ public class ThreadLocalUsage extends Thread { public User user = new User(); public User getUser() { r