文档章节

Java学习日志(12-2-多线程相关操作)

Almon
 Almon
发布于 2016/08/16 15:41
字数 714
阅读 5
收藏 0

停止线程

    run方法结束

    开启多线程运行,代码通常是循环结构,只要控制循环,就可以让线程结束

class StopThread implements Runnable{
	private boolean flag=true;
	public void run(){
		while(flag){
			System.out.println(Thread.currentThread().getName()+"___Run");
		}
	}
	public void changeFlag(){
		flag=false;
	}
}
class StopThreadDemo{
	public static void main(String[] args){
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.start();
		t2.start();
		
		int num=0;
		while(flag){
			if(num++==60){
				st.changeFlag();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"___"+num);
		}
	}
}

特殊情况:

    当线程处于冻结状态,就不会读取到标记,进而线程也不会结束

    使用interrupt()命令强制中断

//运行结果:报告异常

class StopThread implements Runnable{
	private boolean flag=true;
	public synchronized void run(){
		while(flag){
			try{
				wait();
			}
			catch(InterruptedException e){
				System.out.println(Thread.currentThread().getName()+"___Exception");
			}
			System.out.println(Thread.currentThread().getName()+"___Run");
		}
	}
	public void changeFlag(){
		flag=false;
	}
}
class StopThreadDemo{
	public static void main(String[] args){
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.start();
		t2.start();
		
		int num=0;
		while(true){
			if(num++==60){
				t1.interrupt();
				t2.interrupt();
				//st.changeFlag();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"___"+num);
		}
	}
}

处理异常

catch(InterruptedException e){
				System.out.println(Thread.currentThread().getName()+"___Exception");
				flag=false;
			}

    当没有指定的方式让冻结的线程恢复到运行状态时,需要对冻结进行清除

    强制让线程恢复运行,这样就可以操作flag让线程结束

    该方法在Thread类中为interrupt().

守护线程

//运行结果为当Num=60时自动结束

class StopThread implements Runnable{
	private boolean flag=true;
	public synchronized void run(){
			System.out.println(Thread.currentThread().getName()+"___Run");
		}
	}
	public void changeFlag(){
		flag=false;
	}
}
class StopThreadDemo{
	public static void main(String[] args){
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.setDaemon(true);
		t2.setDaemon(true);
		t1.start();
		t2.start();
		
		int num=0;
		while(true){
			if(num++==60){
				break;
			}
			System.out.println(Thread.currentThread().getName()+"___"+num);
		}
		System.out.println("Over");
	}
}

    在启动前调用,当正在运行的线程只有守护线程时,Jvm退出

Join方法

//运行结果为t1运行完后main和t2争夺执行权,交替完成

class jDemo implements Runnable{
	public void run(){
		for(int x=0;x<70;x++){
			System.out.println(Thread.currentThread().getName()+"___"+x);
		}
	}
}
class JoinDemo{
	public static void main(String[] args)throws Exception{
		jDemo d=new jDemo();
		Thread t1=new Thread(d);
		Thread t2=new Thread(d);
		t1.start();
		t1.join();//t1申请执行权
		t2.start();
		for(int x=0;x<80;x++){
			System.out.println("main___"+x);
		}
		System.out.println("Over");
	}
}

t1,t2交替执行 主线程等待t1运行结束后再有控制权

		t1.start();
		t2.start();
		t1.join();

特点:

    当A线程执行到了B线程的join方法时,A就会等待至B线程执行完再运行

    用于临时加入线程执行

优先级

    有1-10个等级,优先级越高执行权越大

		t1.setPriority(Thread.MAX_PRIORITY);

yield方法:暂停该线程转而执行其它线程

class jDemo implements Runnable{
	public void run(){
		for(int x=0;x<70;x++){
			System.out.println(Thread.currentThread().getName()+"___"+x);
			Thread.yield();//暂停该线程
		}
	}
}

开发中多线程常用写法

class ThreadTest{
	public static void main(String[] args){
		new Thread(){
			public void run(){
				for(int x=0;x<100;x++){
					System.out.println(Thread.currentThread().getName()+"___"+x);
				}				
			}
		}.start();
		
		for(int x=0;x<100;x++){
			System.out.println(Thread.currentThread().getName()+"___"+x);
		}
		
		Runnable r=new Runnable(){
			public void run(){
				for(int x=0;x<100;x++){
					System.out.println(Thread.currentThread().getName()+"___"+x);
				}		
			}
		};
		new Thread(r).start();
	}
}

 

© 著作权归作者所有

共有 人打赏支持
Almon
粉丝 2
博文 64
码字总数 44346
作品 0
江北
Java面试需要准备哪些多线程并发的技术要点

一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一...

码蚁说架构
05/31
0
0
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
Java多线程学习(四)等待/通知(wait/notify)机制

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
08/08
0
0
Java面试:投行的15个多线程和并发面试题

本文由ImportNew -一杯哈希不加盐 翻译自dzone。欢迎加入翻译小组。转载请见文末要求。 多线程和并发问题已成为各种 Java 面试中必不可少的一部分。如果你准备参加投行的 Java 开发岗位面试,...

ImportNew
08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

注解

今日学习目标 : 能够使用Junit进行单元测试 能够说出注解的作用 能够使用JDK提供的3个注解 能够根据基本语法编写自定义注解实现类 能够了解自定义注解解析 能够了解元注解使用 能够根据上课案...

码农屌丝
10分钟前
1
0
configure: error: xml2-config not found. Please check your libxml2 installation

安装php时的报错 checking libxml2 install dir... no checking for xml2-config path... configure: error: xml2-config not found. Please check your libxml2 installation. 检查是否安装......

bengozhong
13分钟前
0
0
Java8 new Time Api

Java8 new Time Api JAVA8之前Date/Times Api的问题 线程安全问题 Api 不易理解 Api 转换复杂 1. Main class LocalDate LocalTime LocalDateTime ZonedDateTime Period Duration LocalDate ......

Kenny100120
14分钟前
0
0
403. Frog Jump

Description Tag:Dynamic Programming Difficulty:Hard A frog is crossing a river. The river is divided into x units and at each unit there may or may not exist a stone. The fro......

52iSilence7
16分钟前
0
0
nginx+php+swoole安装记录

领了台阿里服务器1vCPU 1G,做下测试研究。 系统 centos7,使用yum安装。 Nginx yum install nginx##开启nginxservice nginx start 安装php72 安装前确定下系统是否有安装php,有请卸载:...

WalkingSun
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部