Thread 线程

简介: 1.线程的状态 java的线程是通过java.lang.Thread类来实现的。 1.1创建 调用完构造函数后,线程就为创建状态。  1.2就绪 调用start()方法后,所处的状态。 1.3运行 正常的运行。 1.4阻塞 资源等待的状态。 1.5死亡 run()方法执行完毕后,该线程就死掉了。注意不能再次调用此线程的start()方法。 2.常用函数 jav

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;
}

目录
相关文章
|
2月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
34 0
|
1月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
45 7
|
17天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。
|
1月前
|
SQL 机器学习/深度学习 算法
【python】python指南(一):线程Thread
【python】python指南(一):线程Thread
36 0
|
2月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待(Thread Sleep)
|
3月前
|
存储 设计模式 安全
C++一分钟之-并发编程基础:线程与std::thread
【6月更文挑战第26天】C++11的`std::thread`简化了多线程编程,允许并发执行任务以提升效率。文中介绍了创建线程的基本方法,包括使用函数和lambda表达式,并强调了数据竞争、线程生命周期管理及异常安全等关键问题。通过示例展示了如何用互斥锁避免数据竞争,还提及了线程属性定制、线程局部存储和同步工具。理解并发编程的挑战与解决方案是提升程序性能的关键。
66 3
|
3月前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
47 2
|
3月前
|
Java C++ 开发者
线程创建的终极对决:Thread 类 VS Runnable 接口,你站哪边?
【6月更文挑战第19天】在Java多线程编程中,通过`Thread`类直接继承或实现`Runnable`接口创建线程各有优劣。`Thread`方式简洁但不灵活,受限于Java单继承;`Runnable`更灵活,适合资源共享和多接口实现,提高代码可维护性。选择取决于项目需求和设计原则,需权衡利弊。
35 1
|
3月前
|
Java
揭秘!为何Java多线程中,继承Thread不如实现Runnable?
【6月更文挑战第19天】在Java多线程中,实现`Runnable`比继承`Thread`更佳,因Java单继承限制,`Runnable`可实现接口复用,便于线程池管理,并分离任务与线程,提高灵活性。当需要创建线程或考虑代码复用时,实现`Runnable`是更好的选择。
26 0