Java学习之Thread方法
一、sleep()方法:在同步中,释放CPU执行权,不释放同步锁,意味着程序停止
二、停止线程方法:原理:run执行完成
1、设置标记
class StopThread implements Runnable
{
private boolean flag=true;
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName());
} }
public void setFlag()
{
this.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 = 1;
for(;;)
{
if(++num==50)
{
st.setFlag();
break;
}
System.out.println(Thread.currentThread().getName()+";;;;"+num);
}
System.out.println("over");
}
}
2、interrupe方法:在同步线程中,把冻结状态的线程,强制恢复到运行状态,让其获取CPU执行资格
/**
停止线程方法
1、run方法执行完成
2、设置标记
3、interrupt()方法
4、setDaemon() */ //
class StopThread implements Runnable
{
private boolean flag=true;
public void run()
{
while(flag)
{
show();
} } private synchronized void show()
{
try{this.wait();}catch(InterruptedException e){this.flag=false;}
System.out.println(Thread.currentThread().getName());
} public void setFlag()
{
this.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 = 1;
for(;;)
{
if(++num==50)
{
//st.setFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+";;;;"+num);
}
System.out.println("over");
}
}
3、setDaemon(true):设置守护线程,后台线程
class StopThread implements Runnable
{
private boolean flag=true;
public void run()
{
while(flag)
{
show();
} } private synchronized void show()
{
try{this.wait();}catch(InterruptedException e){this.flag=false;}
System.out.println(Thread.currentThread().getName());
} public void setFlag()
{
this.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.setDaemon(true);
t2.start(); int num = 1;
for(;;)
{
if(++num==50)
{
//st.setFlag();
t1.interrupt();
//t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+";;;;"+num);
}
System.out.println("over");
}
}
所有非后台线程都执行完成,后台现在无论处于什么状态都会退出。
三、join方法
class Demo implements Runnable
{
public void run()
{
for(int x=0;x<50;x++)
{
System.out.println(Thread.currentThread().getName()+"...."+x);
}
}
} //将执行join()方法的线程终止,释放其CPU执行权和执行资格,等待join()方法所属的线程执行完成后,才能重新获取CPU执行资格
class JoinDemo
{
public static void main(String[] args)throws Exception
{
Demo st=new Demo(); Thread t1=new Thread(st);
Thread t2=new Thread(st);
t1.start();
t1.join(); //main 线程终止,等待t1线程执行完成才继续执行。
t2.start();
//t1.join();//main 线程终止,t1和t2抢夺CPU执行权,main线程等待t1线程执行完成才继续执行。
for(int x=0;x<50;x++)
{
System.out.println(Thread.currentThread().getName()+"...."+x);
}
System.out.println("over");
}
}
四、yield方法
class Demo implements Runnable
{
public void run()
{
for(int i=0;x<50;x++)
{
System.out.println(Thread.currentThread().getName()+"...."+x);
Thread.yield();//释放CPU执行权,注意:释放CPU执行权,不代表它自己不能再次获取CPU执行权
}
}
}
Java学习之Thread方法的更多相关文章
- Java学习笔记之---方法和数组
Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...
- 【强烈推荐】可能是最适合你的 Java 学习路线和方法
如遇链接无法打开,建议使用 https://github.com/Snailclimb/JavaGuide/blob/master/docs/questions/java-learning-path- ...
- 0019 Java学习笔记-面向对象-方法
方法属于谁 方法要么属于类,要么属于对象 static修饰的方法属于类 没有static修饰的方法属于对象 方法只能定义在类里面,不能独立定义 不能独立的执行方法,要么通过类调用,要么通过方法调用 一 ...
- java学习笔记-Thread
java定义了创建线程的两种方法 1.实现Runnable接口 2.扩展Thread类本身 1.实现Runnable接口: 可以依托任何Runnable接口的对象来创建线程.但是为了实现Runnabl ...
- Java学习总结之方法重载和方法重写
在学习方法的阶段我学习了方法重载(Overload),而在学习面向对象三大特性之继承的时候我又学习了方法重写(Override). 概念: 方法重载:在同一个类中,允许存在一个以上的同名方法,只要 ...
- Java学习笔记之方法重载,动态方法调度和抽象类
一.方法重载 如果子类中的方法与它的超类中的方法有相同的方法名,则称子类中的方法重载超类中的方法,特别是当超类和子类中的方法名和参数类型都相同时,在子类中调用该方法时,超类中的方法会被隐藏.考虑下面程 ...
- 【原】Java学习笔记008 - 方法(函数)
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 方法/函数 Met ...
- Java 学习笔记之 方法内的临时变量是线程安全
方法内的临时变量是线程安全: 方法内部的私有变量,是线程安全的. public class HasSelfPrivateNum { public void addI(String username) ...
- Java学习笔记之方法重载
被重载的方法必须具有不同的参数列表.不能基于不同修饰符或返回值类型来重载方法. package welcome; public class TestMethodOverloading { public ...
随机推荐
- mybatis学习笔记2
1.获得插入语句执行之后的自增主键 <insert id="insertUser" parameterType="com.mybatis.po.User" ...
- CSS的置换和非置换元素
一个来自面试的坑. 面试的时候考官先问了行内元素和块级元素的区别,这个不难理解.然后一脚就踩进了,置换元素的坑.例如img就是行内置换元素,这种行内元素是可以设置宽高的. 什么是置换元素 一个内容不受 ...
- [转]云计算:SaaS、PaaS、IaaS、CaaS
http://blog.csdn.net/it_man/article/details/8441902 近两年来,随着云计算技术的飞速发展,越来越多的厂商意识到了它巨大的潜在价值.随着微软.IBM.G ...
- C语言接口
struct i_foo * foobar_foo(void); //返回接口指针struct foo_object * foo_create(struct i_foo *iface, void *d ...
- XMPP即时通讯协议使用(八)——基于订阅发布实现消息流转业务泳道图
- vue不是内部或外部命令的解决方法
1.在nodejs的安装目录下,找到vue.cmd,将此路径加到环境变量中,我是通过nvm管理node版本的,路径是C:\Users\hy\AppData\Roaming\nvm\v6.10.0,关闭 ...
- Django 高级配置
目录 Django 信号 信号系统三要素: 信号的分类: Django 内置信号: 具体 Django 信号内容 定义信号 发送信号 接收信号 信号接收器 防止重复信号 Django 内置信号操作步骤 ...
- django项目中账号注册登陆使用JWT的记录
需求分析 1. 注册用JWT做状态保持 1.1 安装jwt pip install djangorestframework-jwt 1.2 去settings里面配置jwt ...
- 前端学习(三十九)移动端app(笔记)
移动端App 开发App的三种方式 Native App 原生 底层语言 java Android oc ...
- mybatis基本查询
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-/ ...