文档章节

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里面多线程同步的一些知识

# 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握同步和线程安全相关的知识将使得我们则更加有优势,同时这些知识并不是非常容易...

欧阳海阳
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
1
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部