线程的创建
继承Thread类
-
自定义线程类继承Thread类
-
重写run()方法,编写线程执行体
-
创建线程对象,调用start()方法启动线程
-
线程不一定立即执行,CPU安排调度
-
package com.ljb.demo2; //创建线程方式一:继承Thread类,重写run()方法,调用start开启线程 public class TestTread1 extends Thread{ //重写run方法 @Override public void run() { //run方法线程体 for (int i = 0; i < 20; i++) { System.out.println("我在看代码--" + i); } } public static void main(String[] args) { //main线程,主线程 //创建一个线程对象 TestTread1 testTread1 = new TestTread1(); //调用start()方法开启线程 testTread1.start(); for (int i = 0; i < 20; i++) { System.out.println("我在学习多线程--" + i); } } }
-
案例:网图下载
-
package com.ljb.demo2; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; //练习Thread,实现多线程同步下载 public class TestTread2 extends Thread{ private String url; //网络图片地址 private String name; //保存的文件名 public TestTread2(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) { TestTread2 t1= new TestTread2("http://codebin.ljb520.cn/" + "wp-content/uploads/2020/06/%E8%8A%B1.jpg","1.jpg"); TestTread2 t2 = new TestTread2("http://codebin.ljb520.cn/wp-c" + "ontent/uploads/2020/06/%E7%99%BD%E4%BA%91.jpg","2.jpg"); TestTread2 t3 = new TestTread2("http://codebin.ljb520.cn/wp-con" + "tent/uploads/2020/06/%E5%B8%90%E7%AF%B7.jpg","3.jpg"); t1.start(); t2.start(); t3.start(); } } //下载器 class WebDownloader{ //下载方法 public void downloader(String url, String name){ try { FileUtils.copyURLToFile(new URL(url), new File(name)); } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常,downloader方法出现问题"); } } }
实现Runnable接口
-
定义MyRunnable类实现Runnable接口
-
实现run()方法,编写线程执行体
-
创建线程对象,调用start()方法启动线程
-
package com.ljb.demo2; //创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类。抵用start方法。 public class TestTread3 implements Runnable{ //重写run方法 @Override public void run() { //run方法线程体 for (int i = 0; i < 20; i++) { System.out.println("我在看代码--" + i); } } public static void main(String[] args) { //创建runnable接口的实现类对象 TestTread3 testTread3 = new TestTread3(); //创建线程对象,通过线程对象来开启我们的线程,代理 // Thread thread = new Thread(testTread3); // thread.start(); new Thread(testTread3).start(); for (int i = 0; i < 20; i++) { System.out.println("我在学习多线程--" + i); } } }
-
案例:买火车票
-
package com.ljb.demo2; //多线程同时操作一个对象 //买火车票的例子 public class TestTread4 implements Runnable{ //票数 private int ticketNums = 10; @Override public void run() { while(true){ if(ticketNums<=0){ break; } //模拟延时,出现并发问题,一张票同时被多人购买 try { Thread.sleep(1200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "-->拿到了第" + ticketNums-- + "票"); } } public static void main(String[] args) { TestTread4 ticket= new TestTread4(); new Thread(ticket,"lujiebin").start(); new Thread(ticket,"laoshi").start(); new Thread(ticket,"xuesheng").start(); } }