publicclassThreadtestextendsThread{@Overridepublicvoidrun(){for(int i =0; i <20; i++){
System.out.println("A"+ i);}}publicstaticvoidmain(String[] args){
Threadtest threadtest =newThreadtest();
threadtest.run();for(int i =0; i <500; i++){
System.out.println("B"+ i);}}}
import java.text.SimpleDateFormat;import java.util.Date;publicclassThreadtest1{publicstaticvoidmain(String[] args){
Date time =newDate(System.currentTimeMillis());//获取当前系统时间while(true){try{
Thread.sleep(1000);
System.out.println(newSimpleDateFormat("hh:mm:ss").format(time));
time =newDate(System.currentTimeMillis());}catch(InterruptedException e){
e.printStackTrace();}}}}
线程礼让 yield
publicclasstestyield{// 礼让不一定成功 看cup心情publicstaticvoidmain(String[] args){// MYyeild mYyeild = new MYyeild();// new Thread(mYyeild,"a").start();// new Thread(mYyeild,"b").start();newThread(()->{//lamda表达式
System.out.println("start1");
Thread.yield();
System.out.println("end1");}).start();newThread(()->{
System.out.println("start2");// Thread.yield();
System.out.println("end2");}).start();}}//class MYyeild implements Runnable{// @Override// public void run() {// System.out.println("start");// Thread.yield();// System.out.println("end");// }//}
join
join 合并线程 ,等这个线程执行完成后,在执行其他线程,其他线程阻塞
可以理解为插队
publicclassjoinimplementsRunnable{@Overridepublicvoidrun(){for(int i =0; i <100; i++){
System.out.println(i);}}publicstaticvoidmain(String[] args)throws InterruptedException {
join join =newjoin();
Thread thread =newThread(join);for(int i =0; i <500; i++){if(i==20){
thread.start();
thread.join();}
System.out.println("main"+i);}}}
线程状态观测
观测线程状态
publicclassTestState{publicstaticvoidmain(String[] args)throws InterruptedException {
Thread thread =newThread(()->{for(int i =0; i <5; i++){try{
Thread.sleep(1000);}catch(InterruptedException e){
e.printStackTrace();}}
System.out.println("");});
Thread.State state = thread.getState();
System.out.println(state);
thread.start();
state = thread.getState();
System.out.println(state);//Runwhile(state != Thread.State.TERMINATED){//只要线程不终止,就一直输出状态
Thread.sleep(100);
state = thread.getState();//更新线程状态
System.out.println(state);//输出状态}
thread.start();//(会报错)线程死亡后就不能再次启动了}}
publicclassTestdaemon{publicstaticvoidmain(String[] args){
God god =newGod();
he he =newhe();
Thread thread =newThread(god);
thread.setDaemon(true);// 默认值式false 表示用户线程,正常的线程都是用户线程
thread.start();// 上帝守护的线newThread(he).start();}}classGodimplementsRunnable{@Overridepublicvoidrun(){while(true){
System.out.println("上帝");}}}classheimplementsRunnable{@Overridepublicvoidrun(){for(int i =0; i <36500; i++){
System.out.println("活着");}
System.out.println("走了");}}}
线程同步
线程不安全的例子
publicclassUnsafeuyTicket{publicstaticvoidmain(String[] args){
Buyticket buyticket =newBuyticket();newThread(buyticket,"我").start();newThread(buyticket,"你").start();newThread(buyticket,"黄牛").start();}}classBuyticketimplementsRunnable{privateint ticketnums =10;boolean flag =true;//外部停止方式@Overridepublicvoidrun(){while(flag){try{
Thread.sleep(100);buy();
ticketnums--;}catch(InterruptedException e){
e.printStackTrace();}}}privatevoidbuy(){if(ticketnums<=0){
flag =false;return;}
System.out.println(Thread.currentThread().getName()+"拿到"+ticketnums);}}
Arrylist线程不安全的例子
import java.util.ArrayList;import java.util.List;publicclassUnsafeList{publicstaticvoidmain(String[] args)throws InterruptedException {
List<String> list =newArrayList<>();for(int i =0; i <10000; i++){newThread(()->{
list.add(Thread.currentThread().getName());//出现问题时 两个线程同时存储一个下标的值就会List就会被修改.}).start();}
Thread.sleep(1000);
System.out.println(list.size());}}
同步方法和同代码块
sychronized方法
publicclassUnsafeuyTicket{publicstaticvoidmain(String[] args){
Buyticket buyticket =newBuyticket();newThread(buyticket,"我").start();newThread(buyticket,"你").start();newThread(buyticket,"黄牛").start();}}classBuyticketimplementsRunnable{privateint ticketnums =10;boolean flag =true;//外部停止方式@Overridepublicvoidrun(){while(flag){try{
Thread.sleep(100);buy();
ticketnums--;}catch(InterruptedException e){
e.printStackTrace();}}}privatesynchronizedvoidbuy(){if(ticketnums<=0){
flag =false;return;}
System.out.println(Thread.currentThread().getName()+"拿到"+ticketnums);}}
解决arrylist线程不安全的例子
import java.util.ArrayList;import java.util.List;publicclassUnsafeList{publicstaticvoidmain(String[] args)throws InterruptedException {
List<String> list =newArrayList<>();for(int i =0; i <10000; i++){newThread(()->{synchronized(list){//同步代码块 锁的是发生变化的对象
list.add(Thread.currentThread().getName());//出现问题时 两个线程同时存储一个下标的值就会List就会被修改.}}).start();}
Thread.sleep(1000);
System.out.println(list.size());}}
package lock;import java.util.TreeMap;publicclassTestPC2{publicstaticvoidmain(String[] args){
TV tv =newTV();newPlayer(tv).start();newWatcher(tv).start();}}classPlayerextendsThread{
TV tv;publicPlayer(TV tv){this.tv = tv;}@Overridepublicvoidrun(){for(int i =0; i <20; i++){if(i%2==0){
tv.play("猫和老鼠");}else{
tv.play("奥特曼");}}}}classWatcherextendsThread{
TV tv;publicWatcher(TV tv){this.tv = tv;}@Overridepublicvoidrun(){for(int i =0; i <20; i++){
tv.watch();}}}//产品classTV{//生产者表演,T//消费者观看,F
String voice;//表演的节目boolean flag =true;//表演publicsynchronizedvoidplay(String voice){if(!flag){try{this.wait();}catch(InterruptedException e){
e.printStackTrace();}}
System.out.println("演员表演了"+voice);//通知观众观看this.voice = voice;this.flag =!this.flag;this.notify();}//观看publicsynchronizedvoidwatch(){if(flag){try{this.wait();}catch(InterruptedException e){
e.printStackTrace();}}
System.out.println("观众观看了");this.flag =!this.flag;this.notify();}}