Java 线程控制(输出奇偶数)
两个线程,一个输出1,3,5,7......99;另一个输出2,4,6,8......100。
1.线程同步
public class ST2 {
int i = 0;
public static void main(String[] args) {
ST2 st1 = new ST2();
new Thread(st1.new Inc()).start();
new Thread(st1.new Dec()).start();
}
private synchronized void inc(){
i++;
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" +++ "+i);
}
private synchronized void dec(){
i--;
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" ----- "+i);
}
class Inc implements Runnable{
@Override
public void run() {
while(true)
inc();
}
}
class Dec implements Runnable{
@Override
public void run() {
while(true)
dec();
}
}
}
输出:
Thread-1 ----- -1
Thread-1 ----- -2
Thread-0 +++ -1
Thread-0 +++ 0
Thread-0 +++ 1
Thread-0 +++ 2
Thread-1 ----- 1
Thread-0 +++ 2
Thread-1 ----- 1
Thread-1 ----- 0
Thread-1 ----- -1
Thread-1 ----- -2
Thread-0 +++ -1
Thread-0 +++ 0
Thread-0 +++ 1
Thread-1 ----- 0
Thread-1 ----- -1
Thread-1 ----- -2
Thread-1 ----- -3
Thread-1 ----- -4
Thread-0 +++ -3
Thread-0 +++ -2
Thread-0 +++ -1
Thread-0 +++ 0
从这里可以看出,线程随机执行。
2.控制线程执行顺序
private synchronized void inc() throws Exception{
b = true;
notifyAll();
i++;
System.out.println(Thread.currentThread().getName()+" ++ "+i);
Thread.currentThread().sleep(1000);
while(b)
wait();
}
private synchronized void dec() throws Exception {
while(!b)
wait();
i++;
System.out.println(Thread.currentThread().getName()+" ++++ "+i);
Thread.currentThread().sleep(1000);
b = false;
notifyAll();
}
输出:
Thread-0 ++ 1
Thread-1 ++++ 2
Thread-0 ++ 3
Thread-1 ++++ 4
Thread-0 ++ 5
Thread-1 ++++ 6
Thread-0 ++ 7
Thread-1 ++++ 8
Thread-0 ++ 9
Thread-1 ++++ 10
Thread-0 ++ 11
Thread-1 ++++ 12
Thread-0 ++ 13
Thread-1 ++++ 14
Thread-0 ++ 15
Thread-1 ++++ 16
Thread-0 ++ 17
Thread-1 ++++ 18
Thread-0 ++ 19
Thread-1 ++++ 20
Thread-0 ++ 21
3.控制线程执行次数
class Inc implements Runnable{
@Override
public void run() {
for(int j=0 ; j<50; j++){
try {
inc();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class Dec implements Runnable{
@Override
public void run() {
for(int j=0 ; j<50; j++){
try {
dec();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Java 线程控制(输出奇偶数)的更多相关文章
- Java 线程控制
一.线程控制 和线程相关的操作都定义在Thread类中,但在运行时可以获得线程执行环境的信息.比如查看可用的处理器数目(这也行?): public class RunTimeTest { public ...
- java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue
在有些严格的系统中,我们需要做到干净的停止线程并清理相关状态.涉及到这个主题会带出很多的相关点,简单的总结如下: 我们知道,在java中,有一个volatile关键字,其官方说明(https://do ...
- java线程控制安全
synchronized() 在线程运行的时候,有时会出现线程安全问题例如:买票程序,有可能会出现不同窗口买同一张编号的票 运行如下代码: public class runable implement ...
- python 输出奇偶数并排序
random_numbers = [] for i in range(40): random_numbers.append(random.randint(1, 100)) num1 = [] num2 ...
- Java多线程:用三个线程控制循环输出10次ABC
转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...
- 漫谈并发编程(二):java线程的创建与基本控制
java线程的创建 定义任务 在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...
- 0039 Java学习笔记-多线程-线程控制、线程组
join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...
- Java中的线程状态转换和线程控制常用方法
Java 中的线程状态转换: [注]:不是 start 之后就立刻开始执行, 只是就绪了(CPU 可能正在运行其他的线程). [注]:只有被 CPU 调度之后,线程才开始执行, 当 CPU 分配给你的 ...
- 浅谈 Java线程状态转换及控制
线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...
随机推荐
- 在Jboss中使用Quartz
Jboss EJB默认使用的定时服务是TimerService,TimerService的使用过程较为繁琐,需要使用一个无状态的serviceBean去实现scheduleTimer, timeout ...
- Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全
Vi简介 Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序. Vi不是排版程序,只是一个纯粹的文本编辑程序. Vi是全屏幕文本编辑器,它没有菜单,只有命令. Vi不是基于窗口的,所以, ...
- .align
.align的作用是针对指令或数据的存放地址对齐.但不同的CPU架构,指令和数据的存储方式不同,也就导致对齐的计量单位不一样. i386:n对齐 ARM:2^n 对齐,ARM架构下,指令都是占32位, ...
- iOS自定义转场动画实战讲解
iOS自定义转场动画实战讲解 转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerA ...
- git设置及常用命令
下载 下载地址:https://git-scm.com/downloads windows系统安装 默认安装即可. 其它系统安装方式请自行百度,网上教程很多. 设置 windows桌面右键,选择Git ...
- eclipse中mat插件使用
http://smallnetvisitor.iteye.com/blog/1826434 User.java class User { private String id; private Stri ...
- 密码学hash函数-SHA256-512
[latexpage] Hash函数又称哈希函数.散列函数.杂凑函数.它是一种单向密码体制,即从一个从明文到密文的不可逆映射,只有加密过程,没有解密过程. Hash函数H将可变长度的数据块M作为输入, ...
- vSphere共享存储全配置流程
1.Openfiler的安装 Openfiler 由rPath Linux驱动,它是一个基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接存储 (NAS) 和基于块的存储区域 ...
- Spring MVC多项单选按钮
以下示例显示如何在使用Spring Web MVC框架的表单中使用多选按钮(RadioButton).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己喜欢的数字的功能.并按 ...
- myeclipse中文编码错误,没有GBK选项
默认编码是UTF-8,但是导入GBK工程后,直接改为ISO-8859-1,但是还是编码错误. 用网上的: 全局编码设置:编码设置的方法:ToolBar-->Window-->Prefere ...