Java的多线程之线程实现
这个是我的一个课堂笔记,希望对你有帮助。
线程简介
多线程:就是多任务一起交替执行,对应生活的例子:吃饭玩手机
吃饭玩手机看似是俩个事情一起执行。但事实上,是你吃口饭,就看一下手机,然后吞下饭。程序也是如此CPU每次只调用一个方法。
普通方法调用和多线程 的区别
普通方法调用: 只有主线程一条执行路径,主线程运行,然后主线程执行其他方法。
多线程: 多条执行路径,主线程和子线程并行交替执行。
创建线程的有三种方式
- Threand(class) : 继承Thread 类 ,
- Runnable (接口) : 实现Runnable 接口
- Callable (接口):实现Callable
Threand(class) : 继承Thread 类
package com.kuang.lesson01;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//练习Thread,实现多线程同步下载图片
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 webDownloader = new WebDownloader();
webDownloader.downloader( url,name );
System.out.println( "下载了"+name );
}
public static void main(String[] args) {
TestThread2 t1 = new TestThread2( "https://www.jiaochengzhijia.com/uploads/allimg/200806/11101Q943-0.jpg" ,"11101Q943-0.jpg");
TestThread2 t2 = new TestThread2( "https://www.jiaochengzhijia.com/uploads/allimg/200806/11101Q943-0.jpg" ,"2.png");
TestThread2 t3 = new TestThread2( "https://www.jiaochengzhijia.com/uploads/allimg/200806/11101Q943-0.jpg" ,"3.png");
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();
}
}
}
这是在下载网图方法,要用到–下载文件的工具类——Commons IO
实现Runnable 接口
package com.kuang.lesson01;
//创建线程方式2:实现runnable 接口,重写run方法,执行线程需要插入runnable 接口实现类,调用stat 方法
public class TestThread3 implements Runnable {
//run 方法线程体
@Override
public void run(){
for(int i = 0; i< 200;i++){
System.out.println( "我在看代码---"+i );
}
}
public static void main(String[] args) {
//创建runnable 接口的实现对象
TestThread3 testThread3 = new TestThread3();
//创建线程对象,通过线程对象来开启我们的线程,代理
// Thread thread = new Thread(testThread3);
//
// thread.start();
new Thread( testThread3 ).start();
for (int i = 0; i < 2000; i++) {
System.out.println( "我在学习多线程--" +i);
}
}
}
实现Callable 接口
package com.kuang.lesson01;
import java.util.concurrent.*;
public class TestCallable implements Callable<Boolean> {
private String url; //网络图片地址
private String name; //保存的文件名
public TestCallable(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 Exception{
TestCallable t1 = new TestCallable( "https://www.jiaochengzhijia.com/uploads/allimg/200806/11101Q943-0.jpg" ,"1.1.pg");
TestCallable t2 = new TestCallable( "https://www.jiaochengzhijia.com/uploads/allimg/200806/11101Q943-0.jpg" ,"1.2.png");
TestCallable t3 = new TestCallable( "https://www.jiaochengzhijia.com/uploads/allimg/200806/11101Q943-0.jpg" ,"1.3.png");
//创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool( 3);
//提交执行
Future<Boolean> rs1 = ser.submit( t1 );
Future<Boolean> rs2 = ser.submit( t2 );
Future<Boolean> rs3 = ser.submit( t3 );
//关闭服务
ser.shutdownNow();
}
}