`
hunankeda110
  • 浏览: 742423 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程常用操作方法

阅读更多

Java多线程常用操作方法

线程的常用方法

 

取得和设置线程名称
在Thread类中,可以通过getName()方法取得线程的名称,通过setName()设置线程的名称
线程的名称一般在启动线程前设置,但也允许为已经运行的线程设置名称,允许两个Thread对象有相同的名字,但为了清洗,应该尽量避免这种情况的发送
如果程序并没有为线程指定名字,则系统会自动为线程分配一个名称

事例

定义一个类

package com.qn.thread;

public class MyThread implements Runnable{

public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("当前线程的名字:"+Thread.currentThread().getName()+"运行 i"+i);
}
}

}

在test类中进行测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test {
public static void main(String[] args) {
MyThread t=new MyThread();
Thread thread=new Thread(t);
Thread thread1=new Thread(t,"qining");//手动设置线程名称
thread.start();
thread1.start();
}
}

结果

结果知道指定的名称会自动出现,如果没有指定名称线程会自动编号的方式完成,安装 Thread-0,Thread-1 依次编号,实际上肯定在类中存在一个static 属性,用于记录编号

取得当前线程 可以通过currentThread()方法取得当前正在运行的线程对象

下面在test类中测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test {
public static void main(String[] args) {
MyThread t=new MyThread();//实例化Runnable线程子类对象
Thread thread1=new Thread(t,"qining");//手动设置线程名称
thread1.start();
t.run();//直接调用Run方法
}
}

结果

此时程序运行的结果,程序中由主方法直接通过线程对象调用run()方法,所以输出的结果中包含一个“main”,此线程是由“t.run()”因为调用此语句是由主方法完成的,也就是说实际上主方法本身也是一个线程-主线程

既然主方法是由线程的形式出现的,那么java运行时候启动多少线程呢?

至少启动两个

每当java程序执行的时候,实际上都会启动一个JVM,每一个JVM实际上就是操作系统中启动一个进程

java中本身还具备了垃圾回收机制,所以java运行时至少启动两个线程,主线程、GC

判断线程是否还在执行

isAlive()

package com.qn.test;

import com.qn.thread.MyThread;

public class test {
public static void main(String[] args) {
MyThread t=new MyThread();//实例化Runnable线程子类对象
Thread thread1=new Thread(t,"qining");//手动设置线程名称
System.out.println("线程开始执行之前----->"+thread1.isAlive());//判断线程是否启动
thread1.start();
System.out.println("线程开始执行之后----->"+thread1.isAlive());
for (int i = 0; i < 3; i++) {
System.out.println("主线程main运行----->"+i);
}
System.out.println("线程开始执行之后----->"+thread1.isAlive());
}
}

结果

线程的强制运行

在线程操作中,可以使用join()方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行

事例

package com.qn.test;

import com.qn.thread.MyThread;

public class test {
public static void main(String[] args) {
MyThread t=new MyThread();//实例化Runnable线程子类对象
Thread thread1=new Thread(t,"qining");//手动设置线程名称
System.out.println("线程开始执行之前----->"+thread1.isAlive());//判断线程是否启动
thread1.start();
System.out.println("线程开始执行之后----->"+thread1.isAlive());
for (int i = 0; i < 50; i++) {
if(i>10){
try {
thread1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("main线程运行:"+i);
}
}
}

结果

线程的休眠

使用休眠可以让线程暂停执行

事例

在类中让线程休眠5000

package com.qn.thread;

public class MyThread implements Runnable{

public void run() {
for (int i = 0; i < 50; i++) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("当前线程的名字:"+Thread.currentThread().getName()+"运行 ,i="+i);
}
}

}

在test类中进行测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test {
public static void main(String[] args) {
MyThread t=new MyThread();//实例化Runnable线程子类对象
Thread thread1=new Thread(t,"qining");//手动设置线程名称
thread1.start();
}
}

结果

此时每次执行都会休眠5秒
线程的终断

一个线程可以被另一个线程中断其操作的状态,使用interrupt()方法完成

事例

定义一个MyThread类

package com.qn.thread;

public class MyThread implements Runnable{

public void run() {
System.out.println("1.进入run()方法");
try {
Thread.sleep(2000);
System.out.println("2.已经完成休眠");
} catch (InterruptedException e) {
System.out.println("3.休眠被中断了");
}
System.out.println("4.run()方法正常结束");
}

}

在test类中测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test1 {
public static void main(String[] args) {
MyThread t=new MyThread();//实例化Runnable线程子类对象
Thread thread1=new Thread(t,"qining");//手动设置线程名称
thread1.start();
thread1.interrupt();
}
}

结果

设置后台线程

在java中只要一个程序没有执行完(一个线程在运行),则整个java进程不会消失,所以,此时可以设置一个后台线程,

这样即使java进程结束了,此后台线程依然会继续执行,要实现这样的操作直接使用setDaemon()方法

事例 定义一个类

package com.qn.thread;

public class MyThread implements Runnable{

public void run() {
while(true){
System.out.println(Thread.currentThread().getName());
}
}

}

在test类中进行测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test2 {
public static void main(String[] args) {
MyThread t=new MyThread();//实例化Runnable线程子类对象
Thread thread1=new Thread(t,"qining");//手动设置线程名称
thread1.setDaemon(true);//这只线程在后台执行
thread1.start();
}
}

结果

虽然是死循环但是此时控制台 不在运行而是在虚拟机后台执行

在java中只要一个程序没有执行完(一个线程在运行),则整个java进程不会消失,所以,此时可以设置一个后台线程,这样即使java进程结束了,此后台线程依然会继续执行,要实现这样的操作直接使用setDaemon()方法
最高优先级 Thread.MAX_PRIORITY
中等优先级 Thread.NORM_PRIORITY
最低优先级 Thread.MIN_PRIORITY

事例 定义一个类

package com.qn.thread;

public class MyThread implements Runnable{

public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("当前线程的名字:"+Thread.currentThread().getName()+"运行 ,i="+i);
}

}

}

在test类中进行测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test3 {
public static void main(String[] args) {
Thread thread1=new Thread(new MyThread(),"线程A");//手动设置线程名称
Thread thread2=new Thread(new MyThread(),"线程B");//手动设置线程名称
Thread thread3=new Thread(new MyThread(),"线程C");//手动设置线程名称
thread1.setPriority(Thread.MIN_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY);
thread3.setPriority(Thread.NORM_PRIORITY);
thread1.start();
thread2.start();
thread3.start();

}
}

结果

这方法的优先级是什么

事例

package com.qn.test;

import com.qn.thread.MyThread;

public class test4 {
public static void main(String[] args) {
System.out.println("主方法的优先级是:"+Thread.currentThread().getPriority());

}
}

结果

5相当于是中等级优先级

线程的礼让

在线程操作中,也可以使用yield()方法将一个线程的操作暂停时让给其他线程执行

事例 定义一个类

package com.qn.thread;

public class MyThread implements Runnable{

public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"运行 ,i="+i);
if (i==3) {
System.out.print("线程礼让:");
Thread.yield();

}

}
}

}

在test类中进行测试

package com.qn.test;

import com.qn.thread.MyThread;

public class test4 {
public static void main(String[] args) {
MyThread my=new MyThread();
Thread t1=new Thread(my,"线程A");
Thread t2=new Thread(my,"线程B");
t1.start();
t2.start();
}
}

结果

 

分享到:
评论

相关推荐

    Java高级程序设计-多线程(二).pptx

    第3章 多线程(二) Java 高级程序设计 Java高级程序设计-多线程(二)全文共34页,当前为第1页。... 3.1.2 同步代码块的使用 Java中多线程中引入了同步监视器,使用同步监视器的常用方式是使用同步代码块,保

    Java 多线程技术:(四)获取线程基本信息_暂停线程_线程的优先级_多线程的安全性_线程同步

    获取线程基本信息_暂停线程_线程的优先级_多线程的安全性_线程同步1.线程操作的常用方法2.暂停线程执行 sleep_yield_join_stop3.线程的优先级问题4.多线程的安全性问题5.线程同步1.同步代码块2.同步方法 1.线程操作...

    Java实现六种常用排序(含源代码)

    Java实现六种常用排序 并用多线程进行速度比较(其实意义不大) 含有代码

    Java线程

    线程常用方法 inturrupt打断线程 join()线程并行执行变为串行 理解线程的概念 一个程序至少有一个进程,一个进程至少有一个线程; 线程是进程的一个实体,是CPU调度和分派的基本单位; 一个线程可以创建和撤销另...

    Java开发技术大全(500个源代码).

    ThreadImRunnable.java 继承Runnable接口实现多线程 mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类...

    java源码包---java 源码 大量 实例

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    Java并发编程之常用的多线程实现方式分析

    主要介绍了Java并发编程之常用的多线程实现方式,结合实例形式分析了java并发编程中多线程的相关原理、实现方法与操作注意事项,需要的朋友可以参考下

    JAVA基础教程

    •JAVA 多线程机制 •IO 操作 •网络程序设计 •Java 常用 API 使用 --第9章 多线程 --第 10 章 文件(IO)操作 --第 11 章 Java Applet 程序 --第 12 章 Java 常用类库 --第十三章 Java 网络程序设计 附录 ...

    Java开发详解.zip

    030902_【第9章:多线程】_线程常用操作方法笔记.pdf 030903_〖第9章:多线程〗_线程操作范例笔记.pdf 030904_【第9章:多线程】_同步与死锁笔记.pdf 030905_【第9章:多线程】_线程操作案例——生产者和消费者笔记....

    JAVA上百实例源码以及开源项目源代码

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    JAVA上百实例源码以及开源项目

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道VB...

    JAVA_API1.6文档(中文)

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    java源码包4

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道...

    Java入门1·2·3——一个老鸟的Java学习心得 高清pdf

    第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...

    java源码包3

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道...

    java api最新7.0

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    Java入门1·2·3:一个老鸟的Java学习心得.rar 超清

    第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...

    java源码包2

     WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书  Java局域网通信——飞鸽传书源代码,大家都知道...

    Java基础知识点总结.docx

    十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五...

Global site tag (gtag.js) - Google Analytics