文档章节

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

Almon
 Almon
发布于 2016/08/16 15:41
字数 714
阅读 4
收藏 0
点赞 0
评论 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

Java编程基础知识点和技术点归纳

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

Java小辰 ⋅ 05/23 ⋅ 0

Java多线程学习(四)等待/通知(wait/notify)机制

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

一只蜗牛呀 ⋅ 04/16 ⋅ 0

Java多线程学习(五)线程间通信知识点补充

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

一只蜗牛呀 ⋅ 04/16 ⋅ 0

Java多线程学习(二)synchronized关键字(2)

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

一只蜗牛呀 ⋅ 04/16 ⋅ 0

Java 编程之美:并发编程高级篇之一

本文来自作者 追梦 在 GitChat 上分享 「Java 编程之美:并发编程高级篇之一」 编辑 | 工藤 前言 借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。 ...

gitchat ⋅ 05/24 ⋅ 0

学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖 ⋅ 06/10 ⋅ 0

Java 使用 happen-before 规则实现共享变量的同步操作

前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。按照官方的...

stateIs0 ⋅ 01/20 ⋅ 0

阿里年薪50WJAVA工程师转大数据学习路线!

大数据有两个方向,一个是偏计算机的,另一个是偏经济的。你学过Java,所以你可以偏将计算机的。 Java程序员想转大数据可行吗?Java是全世界使用人数最多的编程语言。不少程序员选择Java做为...

JAVA丶学习 ⋅ 04/25 ⋅ 0

Java 多线程编程 — 锁优化2

Java多线程编程-(13)- 关于锁优化的几点建议 一、背景 在《 Java多线程编程-(11)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力》 这一篇文章中,我们大致介绍...

晨猫 ⋅ 04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 27分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 54分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部