创建线程有两种方法。一种方法是将类声明为 Thread 的子类,并重写 Thread 类的 run 方法。当调用这个子类的 start() 方法时,线程启动并立即调用该类的 run() 方法。代码示例:
--------------------------------------------------------------------------------
// 这个类继承自 Thread 类
class MyThread1 extends Thread {
// 当线程启动后,这个方法立刻得到调用
public void run() {
//do something...
}
}
--------------------------------------------------------------------------------
然后,下列代码会创建并启动一个线程:
MyThread1 thread = new MyThread1();
thread.start();
创建线程的另一种方法是实现 Runnable 接口,并实现其 run 方法。当线程启动时,run() 方法得到调用。如果需要多个线程共享一个对象时,用这种方法创建线程比较有用的。
--------------------------------------------------------------------------------
class MyThread2 implements Runnable {
// 当线程启动后,这个方法立刻得到调用
public void run() {
//do something...
}
}
--------------------------------------------------------------------------------
然后,下列代码会创建并启动一个线程:
MyThread2 runnable = new MyThread2();
// 创建一个线程并提供给其一个实现了 Runnable 接口的对象
Thread thread = new Thread(runnable);
// 启动这个线程
thread.start();
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
终止线程:
正确的终止一个线程的方法,应当是设置一个供线程定期检查的变量,当线程检查到这个变量的状态发生改变时,则从 run() 方法返回。
Thread.suspend() 和 Thread.stop() 提供了异步方法终止一个线程,然而,由于这些方法是不安全的,因此,已被废弃。使用它们经常导致死锁或不正确的资源释放。
当线程抛出一个未捕获到的 Exception 或 Error 时,也会导致线程终止。
--------------------------------------------------------------------------------
// 创建并启动一个线程
MyThread thread = new MyThread();
thread.start();
// do something...
// 终止线程
thread.allDone = true;
--------------------------------------------------------------------------------
class MyThread extends Thread {
boolean allDone = false;
// 这个方法当线程启动时得到调用
public void run() {
while (true) {
// do something...
if (allDone) {
return;
}
// do something...
}
}
}
加入线程:Thread API 包含了等待另一个线程完成的方法:join() 方法。当调用 Thread.join() 时,调用线程将阻塞,直到目标线程完成为止。
Thread.join() 通常由使用线程的程序使用,以将大问题划分成许多小问题,每个小问题分配一个线程。
调度:
除了何时使用 Thread.join() 和 Object.wait() 外,线程调度和执行的计时是不确定的。如果两个线程同时运行,而且都不等待,您必须假设在任何两个指令之间,其它线程都可以运行并修改程序变量。如果线程要访问其它线程可以看见的变量,如从静态字段(全局变量)直接或间接引用的数据,则必须使用同步以确保数据一致性。
在以下的简单示例中,我们将创建并启动两个线程,每个线程都打印两行到 System.out:
public class TwoThreads {
public static class Thread1 extends Thread {
public void run() {
System.out.println("A");
System.out.println("B");
}
}
public static class Thread2 extends Thread {
public void run() {
System.out.println("1");
System.out.println("2");
}
}
public static void main(String[] args) {
new Thread1().start();
new Thread2().start();
}
}
以上这段代码,我们并不知道这些行按什么顺序执行,只知道“1”在“2”之前打印,以及“A”在“B”之前打印。输出可能是以下结果中的任何一种:
1 2 A B
1 A 2 B
1 A B 2
A 1 2 B
A 1 B 2
A B 1 2
休眠:Thread API 包含了一个 sleep() 方法,它将使当前线程进入等待状态,直到过了一段指定时间,或者直到另一个线程对当前线程的Thread 对象调用了 Thread.interrupt(),从而中断了线程。当过了指定时间后,线程又将变成可运行的,并且回到调度程序的可运行线程队列中。
如果线程是由对 Thread.interrupt() 的调用而中断的,那么休眠的线程会抛出InterruptedException,这样线程就知道它是由中断唤醒的,就不必查看计时器是否过期。Thread.yield() 方法就象 Thread.sleep() 一样,但它并不引起休眠,而只是暂停当前线程片刻,这样其它线程就可以运行了。在大多数实现中,当较高优先级的线程调用Thread.yield() 时,较低优先级的线程就不会运行。
守护线程:一个守护线程的唯一作用就是为其他线程提供服务。如计时器线程,隐藏的系统线程(如垃圾收集线程和由 JVM 创建的其它线程)等都属于守护线程。
可以通过调用Thread.setDaemon(boolean isDaemon) 方法来指明某个线程是守护程序线程。这个方法必须在线程开始之前调用。
线程状态:线程可以有以下四个状态
新生线程(New):用new操作符创建一个线程时,线程还没有开始运行,此时线程处在新生状态。
可运行线程(Runnable):当调用了start()方法后,线程即变为可运行的了。一个可运行线程可能正在运行,也可能没有,这取决于操作系统为该线程提供的运行时间。这正是为什么把这种状态称为runnable而不是running。
被阻塞线程(Blocked):当发生以下任何一种情况时,线程就进入被阻塞状态。
线程通过调用sleep方法进入睡眠状态
线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回给他的调用者
线程试图得到一个锁,而该锁正在被其他线程持有
线程在等待某个触发条件
有人调用了线程的suspend方法(该方法已被废弃,不应再使用)
死线程(Dead):有两个原因会导致线程死亡。
因为run方法正常退出而自然死亡
因为一个未捕获的异常终止了run方法而使线程猝死
特殊情况下,可以调用线程的stop方法来终止一个线程,这个方法抛出一个ThreadDeath出错对象来杀死线程。但是这个方法已作废,不应再使用。为了确定线程是否存活,可以使用isAlive方法进行判断,当线程是可运行或是被阻塞的,这个方法返回true,否则返回false。
分享到:
相关推荐
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
java学习笔记2(多线程)java学习笔记2(多线程)
多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
Java线程是多任务编程的重要组成部分,它允许程序同时执行多个独立的代码片段,从而提高程序的效率和响应性。本文将深入探讨Java线程的概念、原理以及如何在实际编程中进行有效管理。 首先,我们要了解操作系统中的...
### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...
花费了一上午的时候 写了一些demo。认识到四种线程池的区别。上传到csdn 供以后学习
"Java入门第二季学习笔记"可能深入到更复杂的主题,如异常处理、集合框架、IO流和线程。异常处理是Java中处理错误的重要机制,使得程序更加健壮。集合框架包括ArrayList、LinkedList、HashSet、HashMap等数据结构,...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
Java学习笔记 Java是一种流行的编程语言,广泛应用于Android应用程序开发、Web应用程序开发、桌面应用程序开发等领域。以下是Java学习笔记的摘要信息: 一、Java技术基础 * 1.1 编程语言:Java是一种面向对象的...
java基础:多线程学习笔记
这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...
这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303
Java开发学习笔记主要针对的是初学者,旨在帮助他们掌握Java编程的基础知识。下面将详细讲解Java开发中的核心概念和步骤。 一、Java环境变量设置 在开始Java编程之前,我们需要安装Java Development Kit (JDK)并...
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...