两个线程,一个输出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 线程控制(输出奇偶数)的更多相关文章

  1. Java 线程控制

    一.线程控制 和线程相关的操作都定义在Thread类中,但在运行时可以获得线程执行环境的信息.比如查看可用的处理器数目(这也行?): public class RunTimeTest { public ...

  2. java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue

    在有些严格的系统中,我们需要做到干净的停止线程并清理相关状态.涉及到这个主题会带出很多的相关点,简单的总结如下: 我们知道,在java中,有一个volatile关键字,其官方说明(https://do ...

  3. java线程控制安全

    synchronized() 在线程运行的时候,有时会出现线程安全问题例如:买票程序,有可能会出现不同窗口买同一张编号的票 运行如下代码: public class runable implement ...

  4. python 输出奇偶数并排序

    random_numbers = [] for i in range(40): random_numbers.append(random.randint(1, 100)) num1 = [] num2 ...

  5. Java多线程:用三个线程控制循环输出10次ABC

    转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...

  6. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  7. 0039 Java学习笔记-多线程-线程控制、线程组

    join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...

  8. Java中的线程状态转换和线程控制常用方法

    Java 中的线程状态转换: [注]:不是 start 之后就立刻开始执行, 只是就绪了(CPU 可能正在运行其他的线程). [注]:只有被 CPU 调度之后,线程才开始执行, 当 CPU 分配给你的 ...

  9. 浅谈 Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

随机推荐

  1. NodeJS 安装cnpm命令行工具错误问题解决

    考虑问题从两个方面: 1.网速(网络太慢也是安装失败的一个原因) 2.系统用户权限(需要系统最开始使用的用管理员,新增的管理员安装会有问题) 报错问题记录于此: 实际上问题是:Windows_NT 6 ...

  2. 符合BME风格的弹窗\菜单\表格\文件上传控件

    1.弹窗 2.菜单 3.表格 4.文件上传控件 笔记补充......

  3. 利用python批量缩放图片

    废话少说,上代码: import matplotlib as mpl mpl.use('Agg') import os import matplotlib.pyplot as plt from sci ...

  4. Visual Studio - 引入动态库

    以VS2013为例: 1.新建项目 2.选择"Win32控制台应用程序",点确定 勾选“控制台应用程序”和“空项目”选项,点击完成,然后新建一个C文件,在文件头上右键: 3.粘贴准 ...

  5. DatabaseFactory.CreateDatabase 方法操作数据库

    using Microsoft.Practices.EnterpriseLibrary.Data;using Microsoft.Practices.EnterpriseLibrary.Data.Sq ...

  6. tomcat各目录下的作用

    1.tomcat的主目录下的文件   bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令). 重要: 很多环 ...

  7. org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication canc

    重新添加一个凭证,用新的凭证 第二总是取最新的代码,而不是用update 有问题,问哥

  8. mysql存储引擎的种类与差别(innodb与myisam)

    查找数据库的存数引擎: show engines show variables like '%storage_engine%' 更改数据库的引擎更改配置文件/etc/my.cnf 改动default- ...

  9. 关于搭建HTTPS服务器服务

    关于 HTTPS 的基本原理大家都已经不再陌生,今天和大家说说如何搭建一个支持 HTTPS 的服务端. 服务端的 HTTPS HTTPS 已经几乎成为了当前互联网推荐的通信方式,它能最大化保证信息传输 ...

  10. SpringBoot对比传统开发以及自身的优缺点

    SpringBoot是伴随着Spring4.0诞生的,继承了Spring的优点,一经推出,引起了巨大的反向:目前Spring Boot的版本为2.1.0,需要Java7及Spring Framewor ...