直接上代码
public class PrintNum {
private static Object lock = new Object();
private static volatile int num = 0;
public class PrintThread implements Runnable{
@Override
public void run() {
synchronized (lock){
while (num < 100){
System.out.println(Thread.currentThread().getName() + "打印:" + ++num);
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
@Test
public void test(){
new Thread(new PrintThread(),"thread1").start();
new Thread(new PrintThread(),"thread2").start();
}
}
运行结果如下
E:\Java\jdk1.8.0_131\bin\java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51286,suspend=y,server=n -ea -Didea.test.cyclic.buffer.size=1048576 -Dfile.encoding=UTF-8 -classpath E:\javaTools\ideaIU-2017.2.win\lib\idea_rt.jar;E:\javaTools\ideaIU-2017.2.win\plugins\junit\lib\junit-rt.jar;E:\javaTools\ideaIU-2017.2.win\plugins\junit\lib\junit5-rt.jar;E:\Java\jdk1.8.0_131\jre\lib\charsets.jar;E:\Java\jdk1.8.0_131\jre\lib\deploy.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_131\jre\lib\javaws.jar;E:\Java\jdk1.8.0_131\jre\lib\jce.jar;E:\Java\jdk1.8.0_131\jre\lib\jfr.jar;E:\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_131\jre\lib\jsse.jar;E:\Java\jdk1.8.0_131\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_131\jre\lib\plugin.jar;E:\Java\jdk1.8.0_131\jre\lib\resources.jar;E:\Java\jdk1.8.0_131\jre\lib\rt.jar;F:\idea-workspace\afterwork\lishikuan\target\test-classes;F:\idea-workspace\afterwork\lishikuan\target\classes;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter-web\2.1.7.RELEASE\spring-boot-starter-web-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter\2.1.7.RELEASE\spring-boot-starter-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter-logging\2.1.7.RELEASE\spring-boot-starter-logging-2.1.7.RELEASE.jar;E:\servers\RepMaven\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\servers\RepMaven\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\servers\RepMaven\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;E:\servers\RepMaven\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;E:\servers\RepMaven\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;E:\servers\RepMaven\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\servers\RepMaven\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter-json\2.1.7.RELEASE\spring-boot-starter-json-2.1.7.RELEASE.jar;E:\servers\RepMaven\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;E:\servers\RepMaven\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;E:\servers\RepMaven\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;E:\servers\RepMaven\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;E:\servers\RepMaven\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;E:\servers\RepMaven\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter-tomcat\2.1.7.RELEASE\spring-boot-starter-tomcat-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\apache\tomcat\embed\tomcat-embed-core\9.0.22\tomcat-embed-core-9.0.22.jar;E:\servers\RepMaven\org\apache\tomcat\embed\tomcat-embed-el\9.0.22\tomcat-embed-el-9.0.22.jar;E:\servers\RepMaven\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.22\tomcat-embed-websocket-9.0.22.jar;E:\servers\RepMaven\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;E:\servers\RepMaven\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\servers\RepMaven\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;E:\servers\RepMaven\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;E:\servers\RepMaven\org\springframework\spring-web\5.1.9.RELEASE\spring-web-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-beans\5.1.9.RELEASE\spring-beans-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-webmvc\5.1.9.RELEASE\spring-webmvc-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-aop\5.1.9.RELEASE\spring-aop-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-context\5.1.9.RELEASE\spring-context-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-expression\5.1.9.RELEASE\spring-expression-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter-test\2.1.7.RELEASE\spring-boot-starter-test-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-test\2.1.7.RELEASE\spring-boot-test-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-test-autoconfigure\2.1.7.RELEASE\spring-boot-test-autoconfigure-2.1.7.RELEASE.jar;E:\servers\RepMaven\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;E:\servers\RepMaven\net\minidev\json-smart\2.3\json-smart-2.3.jar;E:\servers\RepMaven\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;E:\servers\RepMaven\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar;E:\servers\RepMaven\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;E:\servers\RepMaven\org\assertj\assertj-core\3.11.1\assertj-core-3.11.1.jar;E:\servers\RepMaven\org\mockito\mockito-core\2.23.4\mockito-core-2.23.4.jar;E:\servers\RepMaven\net\bytebuddy\byte-buddy\1.9.16\byte-buddy-1.9.16.jar;E:\servers\RepMaven\net\bytebuddy\byte-buddy-agent\1.9.16\byte-buddy-agent-1.9.16.jar;E:\servers\RepMaven\org\objenesis\objenesis\2.6\objenesis-2.6.jar;E:\servers\RepMaven\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\servers\RepMaven\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;E:\servers\RepMaven\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;E:\servers\RepMaven\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;E:\servers\RepMaven\org\springframework\spring-core\5.1.9.RELEASE\spring-core-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-jcl\5.1.9.RELEASE\spring-jcl-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-test\5.1.9.RELEASE\spring-test-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\xmlunit\xmlunit-core\2.6.3\xmlunit-core-2.6.3.jar;E:\servers\RepMaven\org\projectlombok\lombok\1.18.6\lombok-1.18.6.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-devtools\2.1.7.RELEASE\spring-boot-devtools-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot\2.1.7.RELEASE\spring-boot-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-autoconfigure\2.1.7.RELEASE\spring-boot-autoconfigure-2.1.7.RELEASE.jar;E:\servers\RepMaven\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.1.1\mybatis-spring-boot-starter-1.1.1.jar;E:\servers\RepMaven\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\1.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;E:\servers\RepMaven\org\mybatis\mybatis\3.4.0\mybatis-3.4.0.jar;E:\servers\RepMaven\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;E:\servers\RepMaven\org\springframework\boot\spring-boot-starter-jdbc\2.1.7.RELEASE\spring-boot-starter-jdbc-2.1.7.RELEASE.jar;E:\servers\RepMaven\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;E:\servers\RepMaven\org\springframework\spring-jdbc\5.1.9.RELEASE\spring-jdbc-5.1.9.RELEASE.jar;E:\servers\RepMaven\org\springframework\spring-tx\5.1.9.RELEASE\spring-tx-5.1.9.RELEASE.jar;E:\servers\RepMaven\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;E:\servers\RepMaven\com\github\pagehelper\pagehelper\4.1.6\pagehelper-4.1.6.jar;E:\servers\RepMaven\com\github\jsqlparser\jsqlparser\0.9.5\jsqlparser-0.9.5.jar;E:\servers\RepMaven\junit\junit\4.12\junit-4.12.jar;E:\servers\RepMaven\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;E:\servers\RepMaven\javax\servlet\jsp-api\2.0\jsp-api-2.0.jar com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.lishikuan.myproject.lishikuan.PrintNum
Connected to the target VM, address: '127.0.0.1:51286', transport: 'socket'
thread1打印:1
thread2打印:2
thread1打印:3
thread2打印:4
thread1打印:5
thread2打印:6
thread1打印:7
thread2打印:8
thread1打印:9
thread2打印:10
thread1打印:11
thread2打印:12
thread1打印:13
thread2打印:14
thread1打印:15
thread2打印:16
thread1打印:17
thread2打印:18
thread1打印:19
thread2打印:20
thread1打印:21
thread2打印:22
thread1打印:23
thread2打印:24
thread1打印:25
thread2打印:26
thread1打印:27
thread2打印:28
thread1打印:29
thread2打印:30
thread1打印:31
thread2打印:32
thread1打印:33
thread2打印:34
thread1打印:35
thread2打印:36
thread1打印:37
thread2打印:38
thread1打印:39
thread2打印:40
thread1打印:41
thread2打印:42
thread1打印:43
thread2打印:44
thread1打印:45
thread2打印:46
thread1打印:47
thread2打印:48
thread1打印:49
thread2打印:50
thread1打印:51
thread2打印:52
thread1打印:53
thread2打印:54
thread1打印:55
thread2打印:56
thread1打印:57
thread2打印:58
thread1打印:59
thread2打印:60
thread1打印:61
thread2打印:62
thread1打印:63
thread2打印:64
thread1打印:65
thread2打印:66
thread1打印:67
thread2打印:68
thread1打印:69
thread2打印:70
thread1打印:71
thread2打印:72
thread1打印:73
thread2打印:74
thread1打印:75
thread2打印:76
thread1打印:77
thread2打印:78
thread1打印:79
thread2打印:80
thread1打印:81
thread2打印:82
thread1打印:83
thread2打印:84
thread1打印:85
thread2打印:86
thread1打印:87
thread2打印:88
thread1打印:89
thread2打印:90
thread1打印:91
thread2打印:92
thread1打印:93
thread2打印:94
thread1打印:95
thread2打印:96
thread1打印:97
thread2打印:98
thread1打印:99
thread2打印:100
Disconnected from the target VM, address: '127.0.0.1:51286', transport: 'socket'
Process finished with exit code 0