最基本的
package com.sudytech.thread;
public class aaa {
public static void main(String[] args) {
final Method m=new Method();
Runnable r1=new Runnable() {
public void run() {
for(int i=1;i<=5;i++){
m.out1();
}
}
};
Runnable r2=new Runnable() {
public void run() {
for(int i=1;i<=5;i++){
m.out2();
}
}
};
//线程1
new Thread(r1).start();
//线程2
new Thread(r2).start();
}
static class Method{
boolean flag=true;
//方法1
public synchronized void out1(){
while(!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++){
System.out.println("1111111第--"+i+"--次===========");
}
this.notify();
flag=false;
}
//方法2
public synchronized void out2(){
while(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++){
System.out.println("2222222第--"+i+"--次");
}
this.notify();
flag=true;
}
}
}
其实,java的main方法也是一个线程,所以可以这样写:
package com.sudytech.thread;
public class ThreadTest2 {
public static void main(String[] args) {
final Method m=new ThreadTest2.Method();//Method是static,直接用类来引用,不能创建ThreadTest2的实例来引用
Runnable r=new Runnable(){
public void run(){
for(int i=1;i<=10;i++){
m.out1();
}
}
};
Thread thread=new Thread(r);
thread.start();
for(int i=1;i<=10;i++){
m.out2();
}
}
static class Method{//这个方法,会在实现Runnable,重写run方法的被时候调用
//用于标识子线程是否被调用
private boolean flag=false;
//子线程方法
public synchronized void out1(){
while(!flag){
try {
this.wait();//这里的this,是线程锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++){
System.out.println("========子线程执行输出"+i);
}
//子线程调用完,设为false
flag=false;
//唤醒别的在等待的线程
this.notify();
}
//主线程方法
public synchronized void out2(){
while(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++){
System.out.println("主线程执行输出"+i);
}
flag=true;
this.notify();
}
}
}