Java 线程控制(输出奇偶数)

时间:2023-03-09 01:03:44
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();
}
}
}
}