使用线程技术多半是为了并发处理效果,单核通过CPU调度模拟多任务。
一 基础
实现1 :继承java.lang.Thread类,重写run()方法实现线程任务。
public class SimpleThread extends Thread{ @Override public void run() { //线程任务 for (int i = 0; i < 10; i++) { System.out.println("running " + i + " time!"); } } public static void main(String[] args){ //启动线程 new SimpleThread().start(); } }
实现2:实现Runnable接口,重写run()方法实现线程任务
public class SimpleRunnableTest{ public static void main(String[] args){ //启动线程 new SimpleRunnableThread(new Runnable(){ @Override public void run() { //线程任务 for (int i = 0; i < 10; i++) { System.out.println("running " + i + " time!"); } } }).start(); } }
最基础的,没啥大价值。提一下,主线程调用线程类的start()方法线程才能启动,期间Java虚拟机做了必要的准备工作。直接调用线程类的run()方法,相当于在主线程中进行方法调用。和线程没啥关系。
两种实现的关系相当下面:
public class SimpleRunnableThread extends Thread{ private Runnable r; public SimpleRunnableThread(Runnable r){ this.r = r; } @Override public void run() { if(r!=null){ r.run(); } } }
二 Thread类方法
1)setPriority(int newPriority): 修改线程优先级
2)join():等待线程线程销毁,可以用来等待线程任务结束。
3)sleep():线程休眠指定时间
4)yield():线程暂停,让出资源以供其他线程使用。
5)setDaemon(boolean on):设置线程为后台线程(参数为true),当所有后台线程结束时(如主线程),后台线程会被销毁。
演示一下:
public class ThreadMethodTest { public static void main(String[] args) throws Exception { Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("running " + i + " time!"); } } }); // 设置thread为后台线程,主线程执行完毕,thread会被销毁,不管是否执行完成。 thread.setDaemon(true); thread.start(); // 主线程暂时暂停,让thread线程跑一会,多久看系统的任务调度 Thread.yield(); // 主线程加入等待thread销毁,thread必须是执行完成,销毁后,才能解除调用该部分的block //thread.join(); } }
分析 :
1)设置了thread为后台线程,所有只要main线程执行结束,thread线程也会被销毁,程序退出。
2)main线程通过 Thread.yield(); 暂停,以供thread线程执行,Thread能执行多久看系统调度分配。每次输出基本不同。
3)注释掉的 thread.join(); 可以等待thread线程执行完。
三 一种停止循环任务的策略
线程时常用于执行循环任务,直到程序发出结束通知。为防止线程在标志位改变时正在休眠,不能立即结束退出,一般采用设置标志位和InterruptedException 一起使用的方案。
public class StopThreadTest implements Runnable { private boolean allowRun = true; private Thread mThread; @Override public void run() { while (allowRun) { try { System.out.println("Thread do work!"); Thread.sleep(5000); } catch (InterruptedException e) { } } System.out.println("Thread work stop!"); } public void start() { if (mThread == null) { allowRun = true; mThread = new Thread(this); mThread.start(); } } public void stop() { if (mThread != null) { //首先设置标志位,当线非休眠执行任务状态时正常退出。 allowRun = false; //如果线程休眠状态,通过InterruptedException退出 mThread.interrupt(); mThread = null; } } public static void main(String[] args) throws Exception { StopThreadTest test = new StopThreadTest(); test.start(); Thread.sleep(1000); test.stop(); } }
四 线程状态转换
摘自《Java多线程设计模式》,对线程控制很有帮助。
图片来源:http://blog.csdn.net/yuan22003/article/details/6754504。
六 可暂停的线程
做了个可暂停的线程,某些场景比较有用。
class AdvancedThread extends Thread { private boolean allowRun; private boolean isPaused; private Object lock = new Object(); // 启动 public synchronized void startJob() { if (getState() == Thread.State.NEW) { allowRun = true; isPaused = false; start(); } } @Override public void run() { super.run(); try { while (allowRun) { while (isPaused) { synchronized (lock) { // 加入lock对象的等待队列,等待直到其他线程调用lock对象的notify()或notifyAll(). // 约定,使用哪个对象的wait(),必须获得给对象的Monitor(通过synchronized获得),否则会抛出IllegalMonitorStateException lock.wait(); } } System.out.println(Thread.currentThread() + " running!"); } } catch (InterruptedException e) { // 强制停止方法 } } // 暂停 public synchronized void pauseJob() { if (!isPaused) { isPaused = true; System.out.println(Thread.currentThread() + " paused!"); } } // 恢复 public synchronized void resumeJob() { if (isPaused) { isPaused = false; synchronized (lock) { // 约定,使用哪个对象的notify(),必须获得给对象的Monitor,否则会抛出IllegalMonitorStateException lock.notifyAll(); } System.out.println(Thread.currentThread() + " resumed!"); } } /** * 线程停止的条件:非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run * 方法之外的异常。 */ public synchronized void stopJob() { if (getState() != Thread.State.NEW && getState() != Thread.State.TERMINATED) { allowRun = false; // 中断线程。 /* * 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) * 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 * sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 * InterruptedException。 * * 如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 * ClosedByInterruptException。 本除用于强制停止等待的线程 */ interrupt(); System.out.println(Thread.currentThread() + " stopped!"); } } }
相关推荐
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
Java线程亲和性(Thread Affinity)是一个高级并发编程概念,主要涉及到操作系统调度和硬件资源的优化。在多核处理器系统中,线程亲和性允许开发者指定某个线程应该运行在哪个特定的处理器核心上,从而提高性能、...
"Java.Threads,3rd.Edition.chm"可能是一个关于Java线程的第三版电子手册,通常这类资源会详细讲解线程的创建、生命周期、同步机制、线程池等主题。它可能涵盖了线程的基本概念,如如何创建和启动线程,以及如何通过...
TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...
#### 继承Thread类 ```java class MyThread extends Thread { public void run() { // 在这里编写线程执行的代码 } } ``` #### 实现Runnable接口 ```java class MyRunnable implements Runnable { public ...
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...
Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...
在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable接口以及使用ExecutorService和Future等高级API。下面将详细探讨这些知识点。 首先,Java中创建线程主要有两种方法。一种是通过继承Thread...
Java线程是多任务编程的重要概念,特别是在大型的、复杂的软件系统中,它允许程序同时执行多个不同的任务,提升程序的并发性和效率。本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在...
Java线程是Java编程中的重要概念,特别是在多核处理器和并发处理中不可或缺。Java线程允许程序在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在燕山大学信息学院计算机系的课程中,李峰教授讲解了...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...
Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...
首先,`Thread`类是Java中的核心类,它代表了程序中的一个执行线程。当你创建一个新的`Thread`对象并启动它时,Java虚拟机(JVM)会为这个线程分配CPU时间片,从而使得代码可以在不同的线程间交替执行。 要实现...
继承Thread类时,我们需要重写Thread类的`run()`方法,并创建Thread对象来启动线程。而实现Runnable接口则更灵活,因为它允许我们避免了Java的单继承限制。只需实现`run()`方法,然后将Runnable对象传递给Thread的...
### Java线程知识点详解 #### 一、Java线程概览 - **定义**: Java线程是Java语言中实现多线程编程的核心概念之一。它允许开发者在一个进程中创建多个独立执行的路径,这些路径可以并发运行,从而提高程序的效率和...
线程优先级和守护线程也是Java线程中的一部分,`Thread`类提供了设置优先级的方法,高优先级的线程更有可能获得CPU执行时间。守护线程是一种特殊的线程,它不会阻止JVM的退出,除非所有的非守护线程都已结束。 书中...
通过学习这个Java线程使用教程,你将能够熟练地在多线程环境中编写高效、安全的Java程序,理解线程同步、通信、线程池以及并发工具类的使用。阅读提供的"Java线程.pdf"和"说明.txt"文件将帮助你更深入地掌握这些知识...
Java线程类应用是Java编程中的重要组成部分,它关乎到多任务处理和程序并发执行的能力。在Java中,线程是程序执行的最小单位,它允许一个程序中有多个执行流同时进行,使得程序能更高效地利用系统资源,特别是在处理...
Java线程是Java编程中的重要概念,特别是在处理并发和多任务执行时不可或缺。`Thread`类是Java中用于实现线程的基本接口,它位于`java.lang`包中。本实例将深入探讨`Thread`类的使用,这对于初学者掌握多线程编程至...