`
xiao1zhao2
  • 浏览: 39490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中的并发:线程的基本使用

阅读更多
目录
  1.生命周期
  2.常用方法
  3.守护线程

 

1.生命周期

  1)初始状态    此时线程处于JVM的进程中,只是创建了一个线程对象,并没有开始运行.(new())
  2)就绪状态
    此时线程进入可运行状态,等待CPU调度.(start())
  3)运行状态
    拥有CPU的执行权,并且开始运行线程.(run())
  4)阻塞状态
    线程在等待IO或者调入了sleep()或join()等方法会导致线程进入阻塞状态,从阻塞状态出来的线程不一定马上回到运行状态,而是回到可运行状态等待CPU的再次调度.(blocked)
  5)等待队列状态
    一个线程调用一个对象的wait()方法会放弃该对象的锁并进入等待队列状态,只有当另一线程调用临界资源的notify()或者notifyAll()才会将等待队列中的线程释放,进入锁池状态.(waiting)
  6)锁池状态
    每个对象都有互斥锁标记,如果一个线程想访问一个对象,而该对象的锁标记已被另一线程占用,则该线程进入锁池状态.从锁池状态出来的线程回到可运行状态,等待CPU调度.(locked)
  7)终止状态
    一个线程运行结束后称为终止状态,也叫死亡状态一个进程只有所有的线程退出后才能终止.(dead)

 

 

2.常用方法

  线程操作
    currentThread()   返回对当前正在执行的线程对象
    run()    线程体内执行的代码应该都放在run方法里,用户不应该直接调用run()方法
    start()    使该线程开始执行并调用该线程的run方法
    yield()    暂停当前正在执行的线程对象,并执行其他线程
    sleep()    在指定的毫秒数内让当前正在执行的线程休眠
    join()    等待该线程终止
    interrupt()   中断线程
  线程测试
    isAlive()   测试线程是否处于活动状态
    isInterrupted()   测试线程是否已经中断
    isDaemon()   测试该线程是否为守护线程
  线程属性
    setName()   改变该线程的名称
    getName()   返回该线程的名称
    setPriority()   更改线程的优先级
    getPriority()   返回线程的优先级
    setDaemon()   将该线程标记为守护线程或用户线程

  1)每一个java程序都有一个默认的主线程,即main()函数.

				public class ThreadDemo {
					public static void main(String[] args) {
						Thread thr = new Thread(new MyThread());
						thr.start();
						int j = 0;
						while (j++ < 10) {
							System.out.println(Thread.currentThread().getName() + "..." + j);
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e) {
							}
						}
					}
				}

				class MyThread implements Runnable {
					@Override
					public void run() {
						int i = 0;
						while (i++ < 10) {
							System.out.println(Thread.currentThread().getName() + "..." + i);
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e) {
							}
						}
					}
				}

 

运行结果:main线程和Thread-0线程不规则交替执行,各自每隔1s输出直到结束.

  2)调用join方法会在当前线程内等待某一线程终止,内部调用了Object的wait()方法.例:

				public class ThreadDemo {
					public static void main(String[] args) {
						Thread thr = new Thread(new MyThread());
						thr.start();
						try {
							thr.join();
						} catch (InterruptedException e) {
						}
						int j = 0;
						while (j++ < 100) {
							System.out.println(Thread.currentThread().getName() + "..." + j);
						}
					}
				}

				class MyThread implements Runnable {
					@Override
					public void run() {
						int i = 0;
						while (i++ < 100) {
							System.out.println(Thread.currentThread().getName() + "..." + i);
						}
					}
				}

 

运行结果:Thread-0线程全部输出完毕,main线程才继续执行.

  3)调用interrupt()方法可以使得处于阻塞状态的线程抛出一个异常,不会中断正在运行的程序.例:

				public class ThreadDemo {
					public static void main(String[] args) {
						Thread thr = new Thread(new MyThread());
						thr.start();
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
						}
						thr.interrupt();
					}
				}

				class MyThread implements Runnable {
					@Override
					public void run() {
						int i = 0;
						while (i++ < Integer.MAX_VALUE) {
							System.out.println(Thread.currentThread().getName() + "..." + i);
						}
					}
				}

 

  运行结果:thr会一直运行.
  但是,调用interrupt()会将中断标志位(isInterrupted())置为true,因此可以通过判断标志位来中断线程:

				class MyThread implements Runnable {
					@Override
					public void run() {
						int i = 0;
						while (!(Thread.currentThread().isInterrupted()) && i++ < Integer.MAX_VALUE) {
							System.out.println(Thread.currentThread().getName() + "..." + i);
						}
					}
				}

 

运行结果:thr运行一段时间后停止.
  一般情况下不建议通过这种方式来中断线程,一般会在MyThread类中增加一个属性isStop来标志是否结束while循环,然后再在while循环中判断isStop的值.

 

3.守护线程

  通过setDaemon(true)方法可以设置一个线程为守护线程,守护线程优先级比较低,随着主线程运行完毕自动结束.在JVM中,像垃圾收集器线程就是守护线程.例:

				public class Test {
					@Override
					public void finalize() {
						System.out.println(Thread.currentThread().getName() + "收垃圾喽~");
					}

					public static void main(String[] args) {
						new Test();
						System.gc();
						System.out.println("主线程Over~");
					}
				}

 

运行结果:
    主线程Over~
    Finalizer收垃圾喽~

  • 大小: 54.9 KB
3
1
分享到:
评论
1 楼 windlike 2015-07-29  
受教了,谢谢!

相关推荐

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    Java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释...Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58

    Java 线程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    Java 模拟线程并发

    最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    JAVA 并发:让线程们翻山越岭,协调有序的舞蹈.md

    JAVA并发:让线程们翻山越岭,协调有序的舞蹈

    Java并发编程:设计原则与模式(第二版)-3

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...

    Java 高并发多线程编程系列案例代码

    Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,

    java并发编程:设计原则与模式.rar

    《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的书籍,它涵盖了并发编程中的关键概念、原则和模式。在Java中,并发处理是优化应用程序性能、提高资源利用率的重要手段,尤其在现代多核处理器的环境...

    Java 并发性和多线程

    Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程

    Java并发编程:设计原则与模式(第二版).rar

    这些API是Java并发编程的核心,书中会详细解析它们的使用方法和应用场景。 3. **线程安全**:线程安全是并发编程中的重要主题,书中会探讨各种线程安全的实现策略,如使用`synchronized`关键字、`volatile`变量、`...

    2023年最新Java高并发多线程面试题

    适用人群:适合想了解或学习高并发多线程的 IT 学生、开发人员、研究人员以及使用Java多线程进行开发的任何人。 能学到什么:常见Java高并发多线程面试问题及在相关场景下如何处理和解决这些问题。 阅读建议:通过...

    Java并发编程:设计原则与模式(第二版)-3PDF

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的权威著作。这本书旨在帮助开发者理解和掌握如何有效地编写可扩展且高效的并发程序。以下是书中涵盖的一些关键知识点: 1....

    Java并发:基础线程同步

    In this chapter, we will cover: 1.Synchronizing a method; 2.Arranging independent attributes in synchronized classes; 3.Using conditions in synchronized code; 4.Synchronizing a block of code with a ...

    Java 并发.pdf_电子版pdf版

    本篇将详细解析Java并发中的线程状态转换、线程的使用方式以及相关概念。 一、线程状态转换 Java线程在执行过程中会经历五种基本状态: 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程可能...

    JAVA多线程并发编程

    线程池是Java并发编程中的重要概念,它有效地管理和控制线程的创建和销毁,提高了系统资源的利用率。Java中,可以通过`Executors`类创建不同类型的线程池: 1. **固定大小线程池**:`newFixedThreadPool(int ...

Global site tag (gtag.js) - Google Analytics