线程的三种创建方式
1.继承Thread类 2.实现Runnable接口 3.实现Callable接口
第一种:继承Thread类,重写run()方法,调用start方法开启线程
public class ThreadTest1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码"+i);
}
}
public static void main(String[] args) {
//main方法主线程体
ThreadTest1 threadTest1=new ThreadTest1();//类的实例化
threadTest1.start();//将start改为run,会发现是先执行的run(),后执行的主线程
for (int i = 0; i <200 ; i++) {
System.out.println("我在学习多线程--"+i);
}
}
}
//start()方法的结果是run方法线程体和主线程体交替执行
1.先创建一个类继承Thread类
2.重写run()
3.使用main()方法写主线程
(1)先实例化类
(2)调用start方法/run方法
4.输出
使用多线程下载图片
package Thread;
import com.sun.jmx.snmp.SnmpUnknownAccContrModelException;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//练习Thread,实现多线程下载图片
public class ThreadTeat2 extends Thread{
private String name;
private String url;
public ThreadTeat2(String url,String name){
this.url=url;
this.name=name;
}
//下载图片线程的执行体
@Override
public void run() {
webDownloader webdownloader=new webDownloader();
webdownloader.downloader(url,name);
System.out.println("下载的文件名为:"+name);
}
public static void main(String[] args) {
ThreadTeat2 t1=new ThreadTeat2("https://img-blog.csdnimg.cn/img_convert/3ab185d935989e4890ad5f1150d50b6e.png","1.jpg");
ThreadTeat2 t2=new ThreadTeat2("https://img-blog.csdnimg.cn/direct/c4db8229304b4b65b947fe2e55a6c6e1.jpeg","2.jpg");
t1.start();
t2.start();
}
}
//下载器
class webDownloader {
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));//调用文件工具使用包,拷贝一个URL的地址到文件
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出现问题");
}
}
}
注:需要先下载commons-io.2.6 ,commons io 是针对IO流功能的工具类库
Runnable 接口实现线程的启动
public class ThreadTest3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在学Java"+i);
}
}
public static void main(String[] args) {
//创建runnable接口的实现类对象
ThreadTest3 threadTeat3=new ThreadTest3();
//创建线程对象,通过线程开启我们的线程
//Thread thread=new Thread(threadTeat3);
new Thread(threadTeat3).start();
for (int i = 0; i < 100; i++) {
System.out.println("我在学线程-------"+i);
}
}
}
1.写一个类继承runnable接口
2.重写run方法
3.写一个main方法实现主线程
4.创建接口的实现类对象
5.创建线程对象,通过线程对象实现run方法
6.输出
由于Java是单继承,所以常常使用runnable接口实现线程的创建
Runnable接口实现抢票–多线程并发
public class ThreadTeat4 implements Runnable{
private int ticketNums=10;
@Override
public void run() {
while(true){
if(ticketNums<0){
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}//捕获异常快捷键ctrl+alt+t
System.out.println(Thread.currentThread().getName()+"-->拿到了"+ticketNums--+"张票");
}
}
public static void main(String[] args) {
ThreadTeat4 threadTeat4=new ThreadTeat4();
new Thread(threadTeat4,"小明").start();//name是线程的名字
new Thread(threadTeat4,"小花").start();
new Thread(threadTeat4,"黄牛").start();
}
}
public class ThreadTeat5 implements Runnable{//龟兔赛跑
//胜利者
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
boolean flag=gameOver(i);
System.out.println(winner +"-->跑了"+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) {
ThreadTeat5 threadTeat5=new ThreadTeat5();
new Thread(threadTeat5,"兔子").start();
new Thread(threadTeat5,"乌龟").start();
}
}