标签:java String url 成神 线程 new 多线程 public png
基本概念
进程与进程
- 说起进程就不得说一下程序,程序是指令和数据的有序集合,起本身就没有任何运行的含义,是一个静态的概念。
- 而进程就是执行程序的一个执行过程,他是一个动态的概念,是系统资源分配的单位。
- 通常在一个进程中包含多个线程,当然一个进程中至少有一个线程,不然没有存在的意义,线程是cpu调度和执行的单位。
注意: 很多多线程是模拟出来的,真正的多线程是指有多个CPU即多核,如服务器;如果是模拟出来的多线程即在一个cup的情况下,在同一个时间点cpu只能执行一个代码,因为切换很快,所以就有同时执行的错觉。
核心概念
- 线程就是独立的执行路径
- 在程序运行过程中,即使没有自己创建线程,后台也会有多个线程,如主线程、gc线程。
- main称之为主线程为系统的入口,用于执行整个程序
- 在一个进程中,如果开辟了多个线程,线程运行由调度器安排,调度器与系统紧密相关,先后顺序不能由人为干预
- 同一份资源操作时,会存在资源抢夺问题,需要加入并发控制。
- 线程会带来额外的开销,如cpu调度时间,并发控制时间。
- 每个线程在自己工作内存交互,内存控制不当会造成数据不一致。
三种创建方式
Thread
- 自定义线程类继承Thread类
- 重写run方法,编写线程执行体
- 创建线程对象,调用run()方法
//1. 自定义线程类继承Thread类
public class Thread1 extends Thread {
//2. 重写run方法,编写线程执行体
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("当前线程"+i);
}
}
public static void main(String[] args) {
// 3. 创建线程对象,调用run()方法
Thread1 t1= new Thread1();
t1.start();
for (int i = 0; i < 1000; i++) {
System.out.println("zhuxianc "+i);
}
}
}
用多线程实现图片下载
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
// 1. 自定义线程类继承Thread类
public class TestThread extends Thread{
String url;//网络图片名
String pathname;//保存图片名
public TestThread(String url,String pathname) {
this.url = url;
this.pathname = pathname;
}
//2 重写run方法,编写线程执行体
@Override
public void run() {
WebDownLoadImage load = new WebDownLoadImage();
load.downLoadMethod(url,pathname);
}
public static void main(String[] args) {
//3. 创建线程对象,调用run()方法
TestThread t1 = new TestThread("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","C://image//1.png");
TestThread t2 = new TestThread("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","2.png");
TestThread t3 = new TestThread("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","3.png");
t1.start();
t2.start();
t3.start();
}
}
//下载器
class WebDownLoadImage{
public void downLoadMethod(String url,String filename){
try{
FileUtils.copyURLToFile(new URL(url),new File(filename));
}catch(IOException e){
e.printStackTrace();
}
}
}
Ruannable
- 自定义线程类实现Runnable接口
- 重写run方法,编写线程执行体
- 创建线程对象,调用run()方法
//1. 自定义线程类实现Runnable接口
public class Runnale1 implements Runnable{
//2. 重写run方法,编写线程执行体
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("当前线程"+i);
}
}
public static void main(String[] args) {
// 3. 创建线程对象,调用run()方法;这里要注意与继承Thread类的区别
// 这里需要一个代理将实例丢进去
Runnale1 r1 = new Runnale1();
new Thread(r1).start();
for (int i = 0; i < 1000; i++) {
System.out.println("主线程"+i);
}
}
}
将上面图片下载,改为Ruannble实现
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class TestThread implements Runnable{
String url;
String pathname;
public TestThread(String url,String pathname) {
this.url = url;
this.pathname = pathname;
}
@Override
public void run() {
WebDownLoadImage load = new WebDownLoadImage();
load.downLoadMethod(url,pathname);
}
public static void main(String[] args) {
TestThread t1 = new TestThread("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","C://image//1.png");
TestThread t2 = new TestThread("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","2.png");
TestThread t3 = new TestThread("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","3.png");
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
}
}
//下载器
class WebDownLoadImage{
public void downLoadMethod(String url,String filename){
try{
FileUtils.copyURLToFile(new URL(url),new File(filename));
}catch(IOException e){
e.printStackTrace();
}
}
}
Runnable
- 实现Runnable接口需要返回值。
- 重写call()方法,需要抛异常
- 创建目标对象
- 创建执行服务:
EXecuteorService ser= Eecutor.newFixedThreadPool(1); - 提交执行:Future result = ser.submit(t1);
- 获取结果 boolean r1 = result.get();
- 关闭服务:ser.shutdownNow();
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
public class Cllable1 implements Callable {
private String url;
private String pathname;
public Cllable1(String url, String pathname) {
this.url = url;
this.pathname = pathname;
}
//返回值可以设置其他值
@Override
public Object call() throws Exception {
WebDownLoad2 webDownLoad2 = new WebDownLoad2();
webDownLoad2.copyImange(url,pathname);
return true;
}
public static void main(String[] args) throws ExecutionException,InterruptedException{
Cllable1 c1 = new Cllable1("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","r1.png");
Cllable1 c2 = new Cllable1("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","r1.png");
Cllable1 c3 = new Cllable1("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png","r1.png");
//1. 创建执行服务:new了一个池子里面可以指定线程数
ExecutorService ser= Executors.newFixedThreadPool(3);
//5. 提交执行:
Future<Boolean> result1 = ser.submit(c1);
Future<Boolean> result2 = ser.submit(c1);
Future<Boolean> result3= ser.submit(c1);
// 6. 获取结果
boolean r1 = result1.get();
boolean r2 = result1.get();
boolean r3 = result1.get();
// 7. 关闭服务:
ser.shutdownNow();
}
}
class WebDownLoad2{
public void copyImange(String url, String pathname){
try{
FileUtils.copyURLToFile(new URL(url),new File(pathname));
}catch (IOException e){
e.printStackTrace();
}
}
}
标签:java,String,url,成神,线程,new,多线程,public,png 来源: https://blog.csdn.net/qq_37439086/article/details/111028617
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。