多线程
三种创建方式
Thread class 继承Thread类(重点) Runnable接口 实现Runnable接口(重点) Callable接口 实现Callable接口(了解)
继承Thread类
自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程
public class TestThread1 extends Thread {
@Override
public void run ( ) {
for ( int i = 0 ; i < 200 ; i++ ) {
System. out. println ( "我在看代码-------" + i) ;
}
}
public static void main ( String[ ] args) {
TestThread1 t = new TestThread1 ( ) ;
t. start ( ) ;
for ( int i = 0 ; i < 1000 ; i++ ) {
System. out. println ( "我在看多线程-------" + i) ;
}
}
}
案例 下载图片
import java. io. File;
import java. io. IOException;
import java. net. URL;
import org. apache. commons. io. FileUtils;
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 ( ) {
WebDownloader web = new WebDownloader ( ) ;
web. dowmloader ( url, name) ;
System. out. println ( "下载了文件名为:" + name) ;
}
public static void main ( String[ ] args) {
TestThread2 t1 = new TestThread2 ( "https://img-home.csdnimg.cn/images/20210120054229.jpg" , "1.jpg" ) ;
TestThread2 t2 = new TestThread2 ( "https://img-home.csdnimg.cn/images/20210120054229.jpg" , "2.jpg" ) ;
TestThread2 t3 = new TestThread2 ( "https://img-home.csdnimg.cn/images/20210120054229.jpg" , "3.jpg" ) ;
t1. start ( ) ;
t2. start ( ) ;
t3. start ( ) ;
}
}
class WebDownloader {
public void dowmloader ( String url, String name) {
try {
FileUtils. copyURLToFile ( new URL ( url) , new File ( name) ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
System. out. println ( "IO异常,dowmloader方法出现问题" ) ;
}
}
}
实现Runnable接口
自定义MyRunnable类继承Runnable接口 实现run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程
public class MyRunnable implements Runnable {
@Override
public void run ( ) {
for ( int i = 0 ; i < 200 ; i++ ) {
System. out. println ( "我在看代码-------" + i) ;
}
}
public static void main ( String[ ] args) {
MyRunnable m= new MyRunnable ( ) ;
new Thread ( m) . start ( ) ;
for ( int i = 0 ; i < 1000 ; i++ ) {
System. out. println ( "我在看多线程-------" + i) ;
}
}
}
小结
初始并发问题
public class Thread1 implements Runnable {
private int ticketNums= 10 ;
@Override
public void run ( ) {
while ( true ) {
if ( ticketNums<= 0 ) {
break ;
}
try {
Thread. sleep ( 200 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
System. out. println ( Thread. currentThread ( ) . getName ( ) + "--拿到了第" + ticketNums-- + "票" ) ;
}
}
public static void main ( String[ ] args) {
Thread1 t= new Thread1 ( ) ;
new Thread ( t, "小一" ) . start ( ) ;
new Thread ( t, "小二" ) . start ( ) ;
new Thread ( t, "小三" ) . start ( ) ;
}
}
案例 龟兔赛跑
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% 10 == 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 r= new Race ( ) ;
new Thread ( r, "兔子" ) . start ( ) ;
new Thread ( r, "乌龟" ) . start ( ) ;
}
}