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)这五 ...
随机推荐
- php中的匿名函数的注意事项
在php5.3以后,php加入匿名函数的使用,今天在使用匿名的时候出现错误,不能想php函数那样声明和使用,详细看代码 $callback=function(){ return "aa&qu ...
- 激活modelsim se 10.4 时运行patch_dll.bat不能生成TXT
问题描述: 激活modelsim时运行patch_dll.bat总是在DOS界面一闪而过,不能生成LICENSE.TXT 问题解决: 先取消文件 mgls64.dll 的只读属性(这句话在README ...
- LINQ操作数组(交集,并集,差集,最值,平均,去重复)
数组是大学里经常拿来做算法练习的对象.一些经典算法非常有价值,考试.装逼.面试都十分有用.但现在是效率时代,编程讲究生产效率,利用LINQ,可以让程序猿避免写一些基本算法,把精力花在业务处理上. 下面 ...
- 如何将webbrowser控件的Cookie倒入CookieContainer供WebRequest使用
先建一个 "CookieContainer " 把WebBrowser中的Cookie保存在里面 //在WebBrowser中登录 ...
- stylelint — css书写规范
sass lint guidance 一.安装:npm intsall -g stylelint 二.配置:http://stylelint.io/user-guide/rules/ (以下规则文件配 ...
- hibernate查询之后用el表达式取值时遇到的问题
String juniorApprovalUserHql = "select c.id,c.username from UserInfo c left join c.userRole whe ...
- phpexcel图形图表(二)图形
原创文章,转载请注明出处:http://www.cnblogs.com/phpgcs 本篇文章实例演示如上图,画3种图形以及多sheet操作等 先回忆下第一篇中line图形的API调用步骤: 1,引入 ...
- java 提取数据
import java.util.regex.Matcher; import java.util.regex.Pattern; public class TextNested { public sta ...
- linux tableau server 连接 presto
记录一下这个弄个好久的难题 linux tableau server 版本 tableau-server-2018-2-0.x86_64.rpm 安装过程 我参照了这儿仁兄 http://ju. ...
- CFindReplaceDialog学习
The CFindReplaceDialog class allows you to implement standard string Find/Replace dialog boxes in yo ...