`
从此醉
  • 浏览: 1051937 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

Java线程小结(一)

 
阅读更多

一、join()方法
等待被join的线程执行完成。
join(long millis)方法
等join的新车的时间最长为minllis毫秒,如果在millis毫秒内被join的线程还没有执行结束,则不再等待。
join(long millis ,int nanos)方法
等待被join的时机最长为millis毫秒加nanos纳秒。

案例:

package com.xiaomo.thread;
public class JoinThread extends Thread {
// 提供一个有参数的构造器,用于设置该线程的名字
public JoinThread(String name) {
super(name);
}
// 重写run方法,定义线程执行体
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) throws Exception {
//启动子线程
new JoinThread("新线程").start();
for (int i = 0; i < 100; i++) {
if (i == 20) {
JoinThread jt = new JoinThread("被Join的线程");
jt.start();
// main线程调用了jt线程的join方法,main线程必须等jt执行结束才会向下执行
jt.join();
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

二、setPriority()和方法:
来设值和取值,
返回线程的优先级,其中setPriority可以是个整数,范围是一到十之间,也可以是MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY三个静态常量。
getPriority()方法
返回线程的优先级。每个线程执行时,都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较小的执行机会。

案例:

package com.xiaomo.thread;
public class PriorityThread extends Thread {
// 定义一个有参数的构造器,用于创建线程时指定name
public PriorityThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(getName() + ",其优先级是: " + getPriority()
+ ",循环变量的值为:" + i);
}
}
public static void main(String[] args) {
// 改变主线程的优先级
Thread.currentThread().setPriority(6);
for (int i = 0; i < 30; i++) {
if (i == 10) {
PriorityThread low = new PriorityThread("低级");
low.start();
System.out.println("创建之初的优先级:" + low.getPriority());
// 设置该线程为最低优先级
low.setPriority(Thread.MIN_PRIORITY);
}
if (i == 20) {
PriorityThread high = new PriorityThread("高级");
high.start();
System.out.println("创建之初的优先级:" + high.getPriority());
// 设置该线程为最高优先级
high.setPriority(Thread.MAX_PRIORITY);
}
}
}
}

三、后台线程(DaemonThread)
有一种线程它是在后台运行的,它的任务是为其他线程提供服务,这种线程称为后台线程,又称为守护线程,又称为精灵线程。JVM的垃圾回收线程就是典型的后台线程。后台线程有个特征:如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread对象的setDaemon(blooean on)方法(参数传true),可将指定线程设置为后台线程,isDaemon()判断该线程是否为后台线程,如果该线程是守护线程,则返回true;否则返回false。

sleep(long millis)方法(线程睡眠)
让当前正在执行的线程暂停并进入阻塞状态,该方法受到系统计时器和线程调度器的精度和准确度的影响。

注:
当前线程调用sleep方法,进入阻塞状态后,在sleep时间段内,该线程不会获得执行的机会,即使系统中没有其他可运行的线程,处于sleep时间段里的线程也不会运行。因此sleep常用来暂停程序的执行,

案例:

package com.xiaomo.thread;
public class DaemonThread extends Thread {
// 重写run方法,定义线程执行体
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) throws InterruptedException {
DaemonThread t = new DaemonThread();
// 将此线程设置成后台线程(必须先设置再启动)
t.setDaemon(true);
// 启动后台线程
t.start();
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
// ------程序执行到此处,前台线程(main线程)结束------
// 后台线程也应该随之结束
}
}

四、yield()方法(线程让步)
yield方法和sleep有点相似的方法,让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态,yield方法只是让当前线程暂停一下,让系统的线程调度器从新调度一次,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程才会获得执行的机会

案例:

package com.xiaomo.thread;
public class YieldThread extends Thread {
public YieldThread(String name) {
super(name);
}
// 定义run方法作为线程执行体
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
if (i == 20) {
Thread.yield();
}
}
}
public static void main(String[] args) {
// 启动两个并发线程
YieldThread yt1 = new YieldThread("高级");
// 将yt1线程设置成为最高优先级
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("低级");
// 将yt2线程设置成为最低优先级
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
}
}

五、sleep方法和yield方法的区别
1,sleep方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级,但yield方法只会给优先级相同或优先级更高的线程执行机会。
2,sleep方法会将线程转入阻塞状态,直到经过阻塞时间,才会转入就绪状态,而yield方法不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态,因此完全有可能某个线程用yield方法暂停之后立即再次获得处理器资源被执行。
3,sleep方法声明抛出InterruptedException异常。所有调用sleep方法时,要么扑捉该异常,要么显示声明抛出该异常。而yield方法则没有声明抛出任何异常。
4,sleep方法比yield方法有更好的可移植性,通常不用依靠yield方法来控制并发线程的执行。

案例:

package com.xiaomo.thread;
import java.util.Date;
public class SleepThread {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println("当前时间:" + new Date() + "--->" + i);
// 调用sleep方法让当前线程暂停1s
Thread.sleep(1000);
}
}
}

出处:http://blog.csdn.net/cl05300629/article/details/13000371作者:伫望碧落

分享到:
评论

相关推荐

    Java多线程小结

    Java中多线程的学习的自我小结,有多线程的意思,多线程常见的控制方法等内容

    java线程基本知识小结.doc

    java线程基本知识小结.doc java线程基本知识小结.doc

    java线程详解

    八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、...

    Java线程类小结(附思维导图)

    NULL 博文链接:https://newjueqi.iteye.com/blog/400862

    java应用程序中使用线程

    3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...

    JAVA多线程操作方法实用大全

    欧柏泰克教学小结:JAVA多线程操作方法实用大全

    Java线程安全问题小结_动力节点Java学院整理

    主要介绍了Java线程安全问题小结的相关资料,需要的朋友可以参考下

    JAVA实现线程的方法

    欧柏泰克课堂小结:JAVA实现线程的方法

    Java程序设计案例教程-第8章-多线程编程.pptx

    第4页 主要内容 8.1 Java线程模型 8.2 创建线程 8.3 同步与线程间通信 8.4 获取线程状态 8.5 本章小结 8.6 思考和练习 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第4页。 8.1 Java线程模型 Java对多...

    JAVA清华大学教程

    清华大学java课程学习使用教程 ★ 第一讲 Java语言概述 ◇课前索引 ◇1.1 java语言的发展史 ◇1.2 java的工作原理 ◇1.3 一切都是对象 ◇1.4 构建java程序 ◇1.5 java程序规范 ◇1.6 建立java开发环境 ◇本...

    突破JAVA万人面试,懂多线程者得天下.zip

    目录网盘文件永久链接 01课程安排av 02什么是并发和并行av ...08线程创建小结av 09线程生命周期avi 10.线程安全问题什么是线程安全avi 11线程安全同题问题分析avi 12线程安全问题线程安全问题演示avi ...............

    清华大学JAVA教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言中...

    JAVA 清华大学 教程

    ★ 第一讲 Java语言概述 ◇课前索引 ◇1.1 java语言的发展史 ◇1.2 java的工作原理 ◇1.3 一切都是对象 ◇1.4 构建java程序 ◇1.5 java程序规范 ◇1.6 建立java开发环境 ◇本讲小结 ◇课后习题 ★ 第二讲...

    Java编程语言详细教程

    ★ 第一讲 Java语言概述 ◇课前索引 ◇1.1 java语言的发展史 ◇1.2 java的工作原理 ◇1.3 一切都是对象 ◇1.4 构建java程序 ◇1.5 java程序规范 ◇1.6 建立java开发环境 ◇本讲小结 ◇课后习题 ★ 第二讲...

    分享40个Java多线程问题小结

    多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级,本文给大家分享40个Java多线程问题小结 的相关资料,需要的朋友可以参考下

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse...

    Java基础知识点总结.docx

    Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java...

Global site tag (gtag.js) - Google Analytics