1.继承Thread类
例子1 // 创建方式一:继承Thread类,重写run()方法 调用start开启线程 public class TestThread01 extends Thread{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("我在看代码"+i); } } public static void main(String[] args) { //main线程 主线程 //创建一个线程对象 TestThread01 testThread01 = new TestThread01(); //调用start开启线程 testThread01.start(); for (int i = 0; i < 2000; i++) { System.out.println("我在学习多线程"+i); } } }
调用start()线程之间交替执行
调用run()和start()的区别
例子2: //实现多线程同步下载图片 public class TestThread02 extends Thread{ private String url; private String name; public TestThread02(String url,String name){ this.url = url; this.name = name; } //下载图片线程的执行体 @Override public void run() { TestThread02 t1 = new TestThread02("https://t7.baidu.com/it/u=4240641596,3235181048&fm=193&f=GIF", "1.jpg"); TestThread02 t2 = new TestThread02("https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF", "2.jpg"); TestThread02 t3 = new TestThread02("https://t7.baidu.com/it/u=1831997705,836992814&fm=193&f=GIF", "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(); } } }
2.实现Runnable接口
//创建线程方式二:实现runnable接口,重写run方法 public class TestThread03 implements Runnable { @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("我在看代码"+i); } } public static void main(String[] args) { //main线程 主线程 //创建runnable接口的实现类对象 TestThread03 testThread03 = new TestThread03(); //创建线程对象,通过线程对象来开启线程,代理 Thread thread = new Thread(testThread03); thread.start(); for (int i = 0; i < 100; i++) { System.out.println("我在学习多线程"+i); } } }
多个线程同时 *** 作同一个对象 买火车票的例子
//发现问题:多个线程 *** 作同一个资源的情况下线程不安全,数据紊乱, 不同的人可以拿到同一张票(看打印结果) public class TestThread04 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) { TestThread04 testThread04 = new TestThread04(); new Thread(testThread04,"小明").start(); new Thread(testThread04,"老师").start(); new Thread(testThread04,"黄牛党").start(); } }上述线程存在不安全性,想要线程安全请看另一篇博客 :线程同步安全
3.实现Callable接口
/线程创建方式三:实现callable接口 //可以定义返回值 //可以抛出异常 public class TestThread05 implements Callable{ private String url; private String name; public TestThread05(String url,String name){ this.url = url; this.name = name; } //下载图片线程的执行体 @Override public Boolean call() throws Exception { WebDownLoader webDownLoader = new WebDownLoader(); webDownLoader.downloader(url,name); System.out.println("下载了文件名为:"+name); return true; } public static void main(String[] args) throws ExecutionException, InterruptedException { TestThread05 t1 = new TestThread05("https://t7.baidu.com/it/u=4240641596,3235181048&fm=193&f=GIF", "1.jpg"); TestThread05 t2 = new TestThread05("https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF", "2.jpg"); TestThread05 t3 = new TestThread05("https://t7.baidu.com/it/u=1831997705,836992814&fm=193&f=GIF", "3.jpg"); //创建执行服务 ExecutorService executorService = Executors.newFixedThreadPool(3); //提交执行 Future r1 = executorService.submit(t1); Future r2 = executorService.submit(t2); Future r3 = executorService.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); //关闭服务 executorService.shutdownNow(); } }
注意:线程开启不一定立即执行,由CPU调度执行
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)