多线程
多线程创建方式一:继承Thread类,重写run方法,调用start开启线程
package com. java. thread;
public class TestThread extends Thread {
@Override
public void run ( ) {
for ( int i = 0 ; i < 20 ; i++ ) {
System. out. println ( "我在学习" + i) ;
}
}
public static void main ( String[ ] args) {
TestThread testThread1 = new TestThread ( ) ;
testThread1. start ( ) ;
for ( int i = 0 ; i < 1000 ; i++ ) {
System. out. println ( "我在打篮球" + i) ;
}
}
}
方式一应用:使用多线程下载网络图片
package com. java. thread;
import org. apache. commons. io. FileUtils;
import java. io. File;
import java. io. IOException;
import java. net. URL;
public class TestThread2 extends Thread {
private String url;
private String name;
public TestThread2 ( String url, String name) {
this . url= url;
this . name= name;
}
@Override
public void run ( ) {
WebDownload webDownload = new WebDownload ( ) ;
webDownload. download ( url, name) ;
System. out. println ( "已下载文件" + name) ;
}
public static void main ( String[ ] args) {
TestThread2 t1 = new TestThread2 ( "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa0.att.hudong.com%2F52%2F62%2F31300542679117141195629117826.jpg&refer=http%3A%2F%2Fa0.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1614047780&t=852ab4c2ec1d3c43ee685c7cf014bec6" , "t1.jpg" ) ;
TestThread2 t2 = new TestThread2 ( "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa0.att.hudong.com%2F52%2F62%2F31300542679117141195629117826.jpg&refer=http%3A%2F%2Fa0.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1614047780&t=852ab4c2ec1d3c43ee685c7cf014bec6" , "t2.jpg" ) ;
TestThread2 t3 = new TestThread2 ( "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa0.att.hudong.com%2F52%2F62%2F31300542679117141195629117826.jpg&refer=http%3A%2F%2Fa0.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1614047780&t=852ab4c2ec1d3c43ee685c7cf014bec6" , "t3.jpg" ) ;
t1. start ( ) ;
t2. start ( ) ;
t3. start ( ) ;
}
}
class WebDownload {
public void download ( String url, String name) {
try {
FileUtils. copyURLToFile ( new URL ( url) , new File ( name) ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
System. out. println ( "IO异常,download方法出现异常!" ) ;
}
}
}
线程创建方式二:实现Runnable接口,使用静态代理方式开启线程
package com. java. thread;
public class TestThread3 implements Runnable {
@Override
public void run ( ) {
for ( int i = 0 ; i < 20 ; i++ ) {
System. out. println ( "我在学习" + i) ;
}
}
public static void main ( String[ ] args) {
TestThread3 testThread3= new TestThread3 ( ) ;
new Thread ( testThread3) . start ( ) ;
for ( int i = 0 ; i < 100 ; i++ ) {
System. out. println ( "我在打篮球" + i) ;
}
}
}
方式二应用:模拟抢票
package com. java. thread;
public class TestThread4 implements Runnable {
private int tictetNums= 10 ;
@Override
public void run ( ) {
while ( true ) {
if ( tictetNums<= 0 ) {
break ;
}
try {
Thread. sleep ( 100 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
System. out. println ( Thread. currentThread ( ) . getName ( ) + "-->拿到了第" + tictetNums-- + "票" ) ;
}
}
public static void main ( String[ ] args) {
TestThread4 ticket = new TestThread4 ( ) ;
new Thread ( ticket, "小明" ) . start ( ) ;
new Thread ( ticket, "小王" ) . start ( ) ;
new Thread ( ticket, "校长" ) . start ( ) ;
}
}
方式二应用:龟兔赛跑
package com. java. thread;
public class Race implements Runnable {
private static String winner;
@Override
public void run ( ) {
for ( int i = 0 ; i <= 100 ; i++ ) {
if ( Thread. currentThread ( ) . getName ( ) . equals ( "兔子" ) && i% 20 == 0 ) {
try {
Thread. sleep ( 1 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
boolean flag= gameOver ( i) ;
if ( flag) {
break ;
}
System. out. println ( Thread. currentThread ( ) . getName ( ) + "-->跑了" + i + "步" ) ;
}
}
private Boolean gameOver ( int steps) {
if ( winner!= null) {
return true ;
}
if ( steps>= 100 ) {
winner= Thread. currentThread ( ) . getName ( ) ;
System. out. println ( "winner is " + winner) ;
return true ;
}
return false ;
}
public static void main ( String[ ] args) {
Race race= new Race ( ) ;
new Thread ( race, "兔子" ) . start ( ) ;
new Thread ( race, "乌龟" ) . start ( ) ;
}
}
线程创建方式三:实现Callable类
package com. java. thread;
import jdk. jshell. spi. ExecutionControl;
import java. util. concurrent. *;
public class TestThread5 implements Callable < Boolean> {
@Override
public Boolean call ( ) {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "在学习" ) ;
return true ;
}
public static void main ( String[ ] args) throws ExecutionException, InterruptedException {
TestThread5 t1 = new TestThread5 ( ) ;
TestThread5 t2 = new TestThread5 ( ) ;
TestThread5 t3 = new TestThread5 ( ) ;
ExecutorService ser= Executors. newFixedThreadPool ( 3 ) ;
Future< Boolean> r1= ser. submit ( t1) ;
Future< Boolean> r2= ser. submit ( t2) ;
Future< Boolean> r3= ser. submit ( t3) ;
Boolean rs1= r1. get ( ) ;
Boolean rs2= r2. get ( ) ;
Boolean rs3= r3. get ( ) ;
System. out. println ( rs1) ;
System. out. println ( rs2) ;
System. out. println ( rs3) ;
ser. shutdownNow ( ) ;
}
}
扩展
静态代理
package com. java. thread;
public class StaticProxy {
public static void main ( String[ ] args) {
You you = new You ( ) ;
WeddingCompany weddingCompany = new WeddingCompany ( you) ;
weddingCompany. Marry ( ) ;
}
}
interface Marry {
void Marry ( ) ;
}
class You implements Marry {
@Override
public void Marry ( ) {
System. out. println ( "我要结婚了!" ) ;
}
}
class WeddingCompany implements Marry {
private You target;
public WeddingCompany ( You target) {
this . target = target;
}
@Override
public void Marry ( ) {
before ( ) ;
this . target. Marry ( ) ;
ending ( ) ;
}
private void ending ( ) {
System. out. println ( "结婚后工作" ) ;
}
private void before ( ) {
System. out. println ( "结婚前准备" ) ;
}
}
Lambda表达式
package com. java. thread;
public class TestLambda {
static class Like2 implements ILike {
@Override
public void Lambda ( ) {
System. out. println ( "Lambda2" ) ;
}
}
public static void main ( String[ ] args) {
ILike like = new Like ( ) ;
like. Lambda ( ) ;
like= new Like2 ( ) ;
like. Lambda ( ) ;
class Like3 implements ILike {
@Override
public void Lambda ( ) {
System. out. println ( "Lambda3" ) ;
}
}
like= new Like3 ( ) ;
like. Lambda ( ) ;
like= new ILike ( ) {
@Override
public void Lambda ( ) {
System. out. println ( "Lambda4" ) ;
}
} ;
like. Lambda ( ) ;
like= ( ) - > {
System. out. println ( "Lambda5" ) ;
} ;
like. Lambda ( ) ;
}
}
interface ILike {
void Lambda ( ) ;
}
class Like implements ILike {
@Override
public void Lambda ( ) {
System. out. println ( "Lambda1" ) ;
}
}
Lambda简化
package com. java. thread;
public class TeatLambda2 {
public static void main ( String[ ] args) {
Love love= null;
love= ( int a) - > {
System. out. println ( "Love" + a) ;
} ;
love. love ( 12 ) ;
love= ( a) - > {
System. out. println ( "Love" + a) ;
} ;
love. love ( 23 ) ;
love= a- > {
System. out. println ( "Love" + a) ;
} ;
love. love ( 45 ) ;
love= a- > System. out. println ( "Love" + a) ;
love. love ( 56 ) ;
}
}
interface Love {
void love ( int a) ;
}