java多线程
多线程 Java.Thread
1、线程简介
进程和线程都是一个时间段的描述,是CPU工作时间段的描述。是运行中的程序指令的一种描述,这需要与程序中的代码区别开来。
电脑 = CPU + RAM +各种资源
电脑的运行 = CPU、寄存器、RAM的交互
-
CPU速度 >= 寄存器速度 >> RAM速度
-
若多个任务需要执行时,则轮流使用CPU(在不同的策略下轮流的概念有偏差),但因为CPU速度很快,所以在外界看来时同时进行。
-
在任何程序想要使用cpu之前,其他所需资源需要到位,处于就绪队列中,用调度算法调用执行
-
进程的上下文环境 = 进程执行时环境 = 除CPU以外的所有执行环境,(主要是寄存器)
-
先加载进程A的上下文,然后开始执行A,保存进程A的上下文,调入下一个要执行的进程B的进程上下文,然后开始执行B,保存进程B的上下文
进程和线程就是对应不同的CPU时间段的描述,线程共享同一进程的资源
进程是资源分配的最小单位
线程是CPU调度的最小单位
此处的线程指的是Java线程
2、线程的创建
名称 | 属性 | 简介 |
---|---|---|
Thread | 类 | 继承Thread类 |
Runnable | 接口 | 实现Runnable接口 |
Callable | 接口 | 了解Callable接口 |
优先级:当某个线程中创建一个新的Thread对象时,新线程的优先级=创建线程的优先级
守护进程:守护进程能自动结束自己的生命周期,即便是有死循环也能轻松面对;
非守护进程:不能自动结束自己的生命周期,main进程就是一个典型的非守护进程
执行过程:主线程和子线程并行交替执行
注:线程不一定执行,看cpu调度安排
2.1、Thread创建线程
创建步骤:
-
创建一个新的类,用来继承Thread
-
重载run方法
-
用start方法启用该线程
public class TestThread extends Thread{
long prime;
TestThread(long prime){
this.prime = prime;
}
@Override
public void run() {
this.prime += 1;
System.out.println("该数已经加一"+this.prime);
}
public static void main(String[] args) {
TestThread thread = new TestThread(15);
thread.start();
}
}
实例:
-
用commons-io包来多线程下载图片
public class TestThread2 extends Thread{ String url; String fileName; TestThread2(String url, String fileName){ this.fileName = fileName; this.url = url; } @Override public void run() { WebDownload webDownload = new WebDownload(); webDownload.downloader(this.url,this.fileName); System.out.println("下载的文件名为"+this.fileName); } public static void main(String[] args) { TestThread2 thread = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF" ,"1.jpg"); TestThread2 thread2 = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF" ,"2.jpg"); TestThread2 thread3 = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF" ,"3.jpg"); thread.start(); thread2.start(); thread3.start(); System.out.println("程序结束"); } }
class WebDownload{ public void downloader(String url, String fileName){ try { FileUtils.copyURLToFile(new URL(url),new File(fileName)); } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常,downloader方法出现问题"); } } }
2.2、Runnable接口创建进程
创建步骤
-
创建一个新的类,用来实现Runnable接口
-
重载run方法
-
把新类对象作为创建Thread对象的实参
-
用Thread对象的start方法启用该线程
public class TestRunnable implements Runnable{
long prime;
TestRunnable(long prime){
this.prime = prime;
}
@Override
public void run(){
this.prime += 1;
System.out.println("prime改变了吗"+this.prime);
}
public static void main(String[] args) {
TestRunnable thread = new TestRunnable(10);
new Thread(thread).start();
}
}