多线程
1、什么是进程和线程
进程: 在操作系统上面运行的一个软件,一个exe程序(windows系统)
- 进程是系统进行资源分配和调用的独立单元,每一个进程都有它的独立内存空间和系统资源
线程: cpu执行的最小单位;一个进程里面有多个线程;
- 一个进程里面,有多个线程; 多线程;
- 每个线程可以做不同的事情;也可以多个线程负责一件之情;
- 多线程,并不能在cpu的层面,节省时间;
- 线程的执行是抢占式的:当前运行的线程在任何时候都可能被挂起,以便另一个线程可以运行. 随机性
线程是进程的组成部分,一个进程可以有多个线程,但一个线程必须有一个父进程.线程可以拥有自己的栈,自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源.因为多个线程共享父进程的所有资源,因此编程比较方便,但必须更加小心,需要确保线程不会妨碍到同一进程里的其他线程.
线程是独立运行的,它并不知道进程中是否还有其他的线程存在.线程的执行是抢占式的:当前运行的线程在任何时候都可能被挂起,以便另一个线程可以运行. 随机性
一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.
从逻辑角度来看,多线程存在于一个应用程序中,让一个应用程序可以有多个执行部分同时进行,但操作系统无须将多个线程看做多个独立的应用,对多线程实现调度和管理以及资源分配.线程的调度和管理由进程本身负责完成.
线程运行时间
并不是线程自己决定自己什么时候运行,连进程也不能决定; 由我们CPU(皇帝)来选择;
一定是由CPU来选择这个时间片交给哪个线程去运行; (线程,可以放弃),最后还是由CPU来选择;
2、 Java如何实现多线程
代码顺序分先后,线程的执行自己跑自己的;
2.1 继承Thread
public class MyThread extends Thread{
public void run(){
//我们这个线程需要实现的功能;要完成任务
}
}
//1: 新建一个线程对象;
//2: 调用start方法;
package com.qianfeng.xqc.day0311;
/**
* 可以创建多个线程
* 线程之间是 并行
* t1 线程 和 t2线程的执行顺序:随机,CPU皇帝(宠幸谁,谁就先运行)
*
*/
public class TestThreadExtends {
//运行的时候,main是一个线程(主线程)
public static void main(String[] args) {
System.out.println("start");
//创建2个线程对象
ThreadDemd t1 = new ThreadDemd("t1");
ThreadDemd t2 = new ThreadDemd("t2");
//通过线程对象启动线程
t1.start();
t2.start();
System.out.println("end");
}
}
/**
* 线程的任务,都是写在run方法里面
* 继承Thread
*
*/
class ThreadDemd extends Thread{
private String name;
public ThreadDemd() {
}
public ThreadDemd(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = 0;i < 10;i++) {
System.out.println(name +":"+ i);
}
}
}
2.2 实现Runnable
public class MyRunable implements Runnable{
public void run(){
//做我们要做的任务;
}
}
//1:新建一个MyRunable对象;
//2:新建一个Thread对象(MyRunable);
//3:通过trhead对象来调用start方法;运行我们的线程;
package com.qianfeng.xqc.day0311;
public class TestThreadIterface {
public static void main(String[] args) {
System.out.println("start");
//实例化一个线程任务类,通过Thread回调使用
Thread t1 = new Thread(new ThreadRunnable("线程一"));
Thread t2 = new Thread(new ThreadRunnable("线程二"));
//启动线程
t1.start();
t2.start();
System.out.println("end");
}
}
/**
* 实现Runnable,实现多线程
*/
class ThreadRunnable implements Runnable{
private String name;
public ThreadRunnable() {}
public ThreadRunnable(String name) {
super();
this.name = name; }
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = 0;i < 10;i++) {
System.out.println(name +":"+ i);
}
}
}