Thread多线程(一)
三高:高可用:数据不能出错
高性能:用户体验要好
高并发:竞争执行
创建线程
三种方式:继承Thread类、实现Runnable接口、实现Callable接口
注意:前两种方式用得比较多,一般推荐使用第二种方式
用户线程:程序必须执行完才能停止
守护线程:
第一种方式:继承Thread类
start方法使用native修饰,调用本地方法,jni技术(了解即可)
示例:继承Thread类,创建简单的多线程
public class Demo extends Thread { @Override public void run() { for(int i=0;i<40;i++) { System.out.println("一边工作"); } } public static void main(String[] args) { Demo d = new Demo() ; d.start(); for(int i=0;i<40;i++) { System.out.println("一边学习"); } } }
示例:多线程下载图片(使用Commons_IO)
public class Downloader extends Thread { private String url ; private String fileName ; public Downloader(String url,String fileName) { this.url = url ; this.fileName = fileName ; } public void urlDownload(String url,String fileName) {//根据url下载资源,并生成指定文件 try { FileUtils.copyURLToFile(new URL(url), new File(fileName)); } catch (MalformedURLException e) { e.printStackTrace(); System.out.println("不合法的url"); } catch (IOException e) { e.printStackTrace(); System.out.println("下载失败"); } } @Override public void run() { urlDownload(url, fileName); } public static void main(String[] args) { Downloader td1 =new Downloader("https://pic2.zhimg.com/v2-7d01cab20858648cbf62333a7988e6d0_qhd.jpg","manva.jpg"); Downloader td2 =new Downloader("http://p1.pstatp.com/large/403c00037462ae2eee13","spl.jpg"); Downloader td3 =new Downloader("http://5b0988e595225.cdn.sohucs.com/images/20170830/d8b57e0dce0d4fa29bd5ef014be663d5.jpeg","success.jpg"); td1.start(); td2.start(); td3.start(); } }
第二种方式:实现Runnable接口
示例:继承Runnable接口,创建简单的多线程
public class Demo2 implements Runnable { @Override public void run() { for (int i = 0; i < 30; i++) { System.out.println("一边学习"); } } public static void main(String[] args) { // 第二种方式 new Thread(new Demo2()).start(); for (int i = 0; i < 30; i++) { System.out.println("一边工作"); } } private static void demo1() { // 第一种方式 Demo2 r = new Demo2(); Thread t = new Thread(r); t.start(); for (int i = 0; i < 30; i++) { System.out.println("一边工作"); } } }
示例:抢票(有线程安全问题)
public class Ticket implements Runnable{ private int ticketNum ; public Ticket(int ticketNum) { this.ticketNum = ticketNum ; } @Override public void run() {//方法没有使用同步,有线程安全问题 while(true) {//票数少于0,票已经卖完 if(ticketNum<0) { break ; } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->"+ticketNum--); } } public static void main(String[] args) {//多个线程操作一个资源,有线程安全问题 Ticket t = new Ticket(100) ; System.out.println(Thread.currentThread().getName()); new Thread(t,"乘客1").start(); new Thread(t,"乘客2").start(); new Thread(t,"乘客3").start(); } }
zwy

浙公网安备 33010602011771号