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)这五 ...
随机推荐
- 【C#系列】你应该知道的委托和事件
[C#系列]你应该知道的委托和事件 本篇文章更适合具有一定开发经验,一定功底,且对底层代码有所研究的朋友!!! 本篇文章主要采用理论和代码实例相结合方式来论述委托和事件,涉及到一些边界技术,如软件 ...
- ASP.NET MVC传递Model到视图的多种方式总结
ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel T ...
- js - 模块化开发的兼容exports的套路
补充:除了第一种的套路,还可以这样使用第二种.都是用来自执行函数的.第二种的好处是,还可以返回一个true. // 常用 ;(function () {})(); // 小技巧(如果不加上!会报错,加 ...
- protobuf 在win10系统如何编译jar包
最近在搞java服务器项目,前段要求用protobuf进行数据传输,以前没搞过,查了很多资料,走了一些弯路! 先把一些需要下载的链接放上来: protobuf下载地址:https://github.c ...
- PLSQL配置数据库的方式
1.直接连接的方式 2.修改客户端D:\app\Administrator\product\11.2.0\client_1\network\admin\tnsnames.ora文件的方式. ora ...
- Map根据value排序
网上找到的资源, package com.test.ch1; import java.util.ArrayList; import java.util.Collections; import java ...
- TP5 Session Db驱动
一.下载附件,解压,文件路径\extend\driver\session\Db.php 驱动文件下载:Db.php 二.创建数据表 DROP TABLE IF EXISTS `platform_ses ...
- 解决easyui tabs中href无法跨域跳转
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...
- WebMethod Session
[WebMethod(EnableSession = true)] public static string SayHello() { LxUserContext depno = HttpContex ...
- 接入qq登录功能出现的问题
在调用qq授权的接口时,出现以上错误. 原因是: 打包的应用签名和第一次上传包的签名不一致造成的 解决方法: 第一种方法:用上次打包apk的keystore重新打包apk,使签名一致. 第二种方法:联 ...