Java线程操作方法

取得和设置线程名称
//=================================================
// File Name : Thread_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:MyThread
// 属性:
// 方法:
class MyThread_1 implements Runnable{ //实现Runnable接口
private String name; // public MyThread_1(String name) { //构造方法
// super();
// this.name = name;
// } @Override
public void run() { //覆写Thread类中的run()方法
// TODO 自动生成的方法存根
for (int i=0;i<10;i++){
// System.out.println(name+"运行,i="+i);
System.out.println(Thread.currentThread().getName()+",i="+i); //取出当前线程的名称
}
} } //主类
//Function : Thread_demo
public class Runnable_demo { public static void main(String[] args) { MyThread_1 mt1 = new MyThread_1(); //实例化Runnable子类对象
new Thread(mt1).start(); //系统自动设置线程名称
new Thread(mt1,"线程A").start(); //手工自动设置线程名称
new Thread(mt1,"线程B").start(); //手工自动设置线程名称
new Thread(mt1).start(); //系统自动设置线程名称
new Thread(mt1).start(); //系统自动设置线程名称
} }
手工设置线程名称 系统自动设置线程名称

判断线程是否启动
使用isAlive()方法来判断线程是否已经启动而且仍然在启动
//=================================================
// File Name : Thread_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:MyThread
// 属性:
// 方法:
class MyThread_1 implements Runnable{ //实现Runnable接口
private String name; public MyThread_1(String name) { //构造方法
super();
this.name = name;
} @Override
public void run() { //覆写Thread类中的run()方法
// TODO 自动生成的方法存根
for (int i=0;i<10;i++){
// System.out.println(name+"运行,i="+i);
System.out.println(Thread.currentThread().getName()+",i="+i); //取出当前线程的名称
}
} } //主类
//Function : Thread_demo
public class Runnable_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
MyThread_1 mt1 = new MyThread_1("线程A "); //实例化Runnable子类对象
MyThread_1 mt2 = new MyThread_1("线程B "); //实例化Runnable子类对象
Thread t1 = new Thread(mt1); //实例化Thread类对象
Thread t2 = new Thread(mt2); //实例化Thread类对象
System.out.println("线程开始执行之前-->"+t1.isAlive());
t1.start(); //启动线程
System.out.println("线程开始执行之后-->"+t1.isAlive());
t2.start(); //启动线程 } }
主线程有可能比其他线程先执行完

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

线程的休眠
在程序中允许一个线程进行暂时的休眠,直接使用Thread.sleep()方法即可实现休眠
程序在执行的时候,每次的输出都会间隔500ms,达到了延时操作的效果。
Thread.sleep()方法要用try和catch语句包围
//=================================================
// File Name : Thread_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:Mythread
// 属性:
// 方法:
class Mythread implements Runnable{ //实现Runnable接口 @Override
public void run() { //覆写Thread类中的run()方法
// TODO 自动生成的方法存根
for (int i=0;i<5;i++){
try{
Thread.sleep(500); //线程休眠
}catch (Exception e){} //需要异常处理
System.out.println(Thread.currentThread().getName()+",i="+i); //取出当前线程的名称
}
} } //主类
//Function : ThreadSleep_demo
public class ThreadSleep_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Mythread m = new Mythread();
new Thread(m,"线程").start();
} }
中断线程
当一个线程运行时,另外一个线程可以直接通过interrupt()方法中断其运行状态。
一个线程启动之后进入了休眠状态,原来是要休眠10s之后再继续执行,但是主方法在线程启动之后的2s之后就将其中断,休眠一旦中断之后将执行catch中的代码。
//=================================================
// File Name : Thread_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:Mythread_1
// 属性:
// 方法:
class Mythread_1 implements Runnable{ //实现Runnable接口 @Override
public void run() { //覆写Thread类中的run()方法
// TODO 自动生成的方法存根
System.out.println("进入run方法");
try{
Thread.sleep(10000); //线程休眠
System.out.println("休眠完成");
}catch (Exception e){ //需要异常处理
System.out.println("休眠被终止");
return; //让程序返回被调用处
}
System.out.println("run方法结束");
} } //主类
//Function : ThreadSleep_demo
public class ThreadInterrupt_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Mythread_1 m = new Mythread_1();
Thread t = new Thread(m,"线程");
t.start();
try{
Thread.sleep(2000); //主线程2s之后再执行中断
}catch(Exception e){}
t.interrupt();
} }
后台线程
在Java程序中,只要前台有一个线程在运行,则整个Java进程都不会消失,所以此时可以设置一个后台线程,这样即使Java进程结束了,此后台线程依然会继续执行。要想实现这样的操作,直接使用setDaemon()方法即可。

线程的优先级
在Java的线程中使用setPriority()方法可以设置一个线程的优先级,在Java的线程中一共有3种优先级。
//=================================================
// File Name : Thread_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:MyThread
// 属性:
// 方法:
class MyThread_1 implements Runnable{ //实现Runnable接口
private String name; // public MyThread_1(String name) { //构造方法
// super();
// this.name = name;
// } @Override
public void run() { //覆写Thread类中的run()方法
// TODO 自动生成的方法存根
for (int i=0;i<10;i++){
//System.out.println(name+"运行,i="+i);
System.out.println(Thread.currentThread().getName()+",i="+i); //取出当前线程的名称
}
} } //主类
//Function : Thread_demo
public class Runnable_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
MyThread_1 mt1 = new MyThread_1(); //实例化Runnable子类对象
MyThread_1 mt2 = new MyThread_1(); //实例化Runnable子类对象
MyThread_1 mt3 = new MyThread_1(); //实例化Runnable子类对象
Thread t1 = new Thread(mt1,"线程A"); //实例化Thread类对象
Thread t2 = new Thread(mt2,"线程B"); //实例化Thread类对象
Thread t3 = new Thread(mt3,"线程C"); //实例化Thread类对象
// System.out.println("线程开始执行之前-->"+t1.isAlive());
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
t1.start(); //启动线程
// System.out.println("线程开始执行之前-->"+t1.isAlive());
t2.start(); //启动线程
t3.start(); //启动线程 // MyThread_1 mt1 = new MyThread_1(); //实例化Runnable子类对象
// new Thread(mt1).start(); //系统自动设置线程名称
// new Thread(mt1,"线程A").start(); //手工自动设置线程名称
// new Thread(mt1,"线程B").start(); //手工自动设置线程名称
// new Thread(mt1).start(); //系统自动设置线程名称
// new Thread(mt1).start(); //系统自动设置线程名称
} }
线程将根据优先级的大小来决定哪个线程会先运行,但是并非线程的优先级越高就一定会先执行,哪个线程先执行将由CPU的调度决定。
主方法的优先级是NORM,通过Thread.currentThread().getPriority()来取得主方法的优先级,结果是5
线程的礼让
在线程的操作中,可以使用yield()方法将一个线程的操作暂时让给其他线程执行。本线程暂停,让其他进程先执行。
//=================================================
// File Name : Thread_demo
//------------------------------------------------------------------------------
// Author : Common // 接口名:MyThread
// 属性:
// 方法:
class MyThread_1 implements Runnable{ //实现Runnable接口
private String name; // public MyThread_1(String name) { //构造方法
// super();
// this.name = name;
// } @Override
public void run() { //覆写Thread类中的run()方法
// TODO 自动生成的方法存根
for (int i=0;i<10;i++){
//System.out.println(name+"运行,i="+i);
System.out.println(Thread.currentThread().getName()+",i="+i); //取出当前线程的名称
if(i==3){
System.out.println("线程礼让:");
Thread.currentThread().yield(); //线程礼让
}
}
} } //主类
//Function : Thread_demo
public class Runnable_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
MyThread_1 mt1 = new MyThread_1(); //实例化Runnable子类对象
MyThread_1 mt2 = new MyThread_1(); //实例化Runnable子类对象
MyThread_1 mt3 = new MyThread_1(); //实例化Runnable子类对象
Thread t1 = new Thread(mt1,"线程A"); //实例化Thread类对象
Thread t2 = new Thread(mt2,"线程B"); //实例化Thread类对象
Thread t3 = new Thread(mt3,"线程C"); //实例化Thread类对象
// System.out.println("线程开始执行之前-->"+t1.isAlive());
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
t1.start(); //启动线程
// System.out.println("线程开始执行之前-->"+t1.isAlive());
t2.start(); //启动线程
t3.start(); //启动线程 // MyThread_1 mt1 = new MyThread_1(); //实例化Runnable子类对象
// new Thread(mt1).start(); //系统自动设置线程名称
// new Thread(mt1,"线程A").start(); //手工自动设置线程名称
// new Thread(mt1,"线程B").start(); //手工自动设置线程名称
// new Thread(mt1).start(); //系统自动设置线程名称
// new Thread(mt1).start(); //系统自动设置线程名称
} }
线程礼让也是不一定的
Java线程操作方法的更多相关文章
- 【转载】深度解读 java 线程池设计思想及源码实现
总览 开篇来一些废话.下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) ...
- Java并发指南12:深度解读 java 线程池设计思想及源码实现
深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- Java线程的概念
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- 第24章 java线程(3)-线程的生命周期
java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
随机推荐
- 屠龙之路_战胜View&对DataBase猛烈进攻_ThirdDay
避开狮身人面兽攻击的屠龙战士继续前行.突然眼见一黑,战士们进到迷宫里,机智的战士用一根羊毛线绑在迷宫入口处,少年们手握着羊毛线,在迷宫里继续前行.在那样一个拐角处,遇到了恶龙的手下View&D ...
- 十天冲刺---Day10
站立式会议 站立式会议内容总结: 燃尽图 照片 没课的周三,队员们共同在活动室奋战了一个下午 继续保持迭代,在周六前完成alpha版本
- js中return的用法
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 【CodeVS 1037】取数游戏
http://codevs.cn/problem/1037/ Alice必胜是Alice将硬币移向边权为0的一端并且把经过的边变为0,让BoB无路可走. 这样只要起点到两个方向最近的0边权的端点的边数 ...
- 【BZOJ 1031】【JSOI 2007】字符加密Cipher
后缀数组模板题,看了一天的后缀数组啊,我怎么这么弱TwT #include<cstdio> #include<cstring> #include<algorithm> ...
- poj2955括号匹配 区间DP
Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5424 Accepted: 2909 Descript ...
- Spring注解@PostConstruct与@PreDestroy
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- 数据库开发基础-SQl Server 视图
1.视图的概述 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表.视图 ...
- PyCharm2016.23专业版注册码
43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- js-this的用法,来自阮一峰老师的文章
1. 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 或者说,this指向当前执行的函数的所有者. 2.情况一:纯粹的函数调用 这是函数 ...