多线程基础:
1、 进程与线程
2、 创建线程
3、 线程操作API
进程与线程:
程序是硬盘上由数据和指令序列组成的文件。
操作系统:是管理程序的程序,管理程序和数据的存储,程序的执行,程序的并发调度,程序的退出等。
1、多线程编程
1、程序:是指令+数据组成的可执行文件,就是在磁盘存储的程序文件,程序是静态的。如,QQ.exe
2、进程:正在内存中执行的程序!占有一定的内存等资源,是动态执行的程序,多个程序并发执行,受操作系统调度。
3、进程的“并发”运行:宏观上是并发的,微观上是交替执行的,每个程序执行一定的时间就切换到另外一个程序。
4、线程:是“进程中”“并发”执行的“过程(方法)”,共享进程的内存,线程的并发也是操作系统调度,进程的并发实际上是线程的并发。
5、并发:CPU只能处理一个流程,操作系统分时将线程交给CPU执行,所有的线程走走停停,某个时间点只有一个线程在Running(考虑单处理器的情况)状态。
6、进程的并发,实际上是利用操作系统调度线程并发实现的。
7、进程拥有内存空间,线程共享进程的内存
8、Java中Java进程占用内存(方法区、堆内存、栈),Java 中的线程共享进程的内存,访问堆中的对象
2、什么是进程:
进程:正在内存中执行的程序!
进程是一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。
线程只能归属于一个进程并且只能访问该进程所拥有的资源。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。
3、什么是线程:
在计算机内部,凡是并发性操作,都是线程实现的。比如,在QQ中跟两个人一起聊天。
线程是进程中并发执行的过程(方法)。
同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此线程也被称为轻负荷进程。一个进程中可以包含多个线程。
4、进程与线程的区别:
进程包含线程,进程占有内存,线程属于进程,共享进程内存。进程的并发本质上是利用线程的并发实现的。
5、线程使用场合:
凡是在软件中,处理并发执行,都要用到线程。
比如:多线程聊天、多线程下载
在软件中,凡是出现一起干的活,都是线程。
6、并发原理:
多个线程同时运行,只是我们感官上的一种表现。事实上线程是并发运行的,OS将时间划分为很多时间片段,尽可能均匀分配给每一个线程,获取时间片段的线程被CPU运行,而其他线程全部等待。所以微观上是走走停停的,宏观上都在运行。这种现象叫并发,但是不是绝对意义上的“同时发生”。
7、 线程的状态:见本子
创建线程:
1、一个线程就是一个对象。
2、线程对象中一定有一个可以并发执行的过程(方法)。
3、线程是软件中并发运行的过程。
4、线程有API类Thread,代表线程的类型。
5、如何创建线程:
1、 继承Thread类,就是创建具体的(用户自己定义的)线程类型
2、 重写线程并发方法run(),提供一个自己定义的并发方法
3、 使用new创建具体的线程对象
4、 使用线程API方法start(),尽快启动run()方法,也就是启动了并发执行的方法。
public class DemoThread {
public static void main(String[] args) {
MyThread t1=new MyThread();//启动一个线程
MyThread t2=new MyThread();//启动一个线程
t1.start();//尽快启动run()方法
t2.start();//尽快启动run()方法
}
}
class MyThread extends Thread{
public void run() {
for(int i=1;i<=100;i++) {
System.out.println(i);
}
}
}
6、使用Runnable创建并启动线程
实现Runnable接口并重写run方法来定义线程体,然后在创建线程的时候将Runnable的实例传入并启动线程。
这样做的好处在于可以将线程与线程要执行的任务分离开减少耦合,同时java是单继承的,定义一个类实现Runnable接口这样的做法可以更好的去实现其他父类或接口。因为接口是多继承关系。
1、 实现Runnable接口
2、 实现run方法
3、 newThread(new 实现Runnable接口类型) 新建状态的线程
4、 使用Thread类的start方法启动线程(Runnable)
5、 线程会尽快执行run方法(Running)
public class DemoRunnable {
public static void main(String[] args) {
Runner runner=new Runner();
Thread t1=new Thread(runner);
Thread t2=new Thread(new Runner());
t1.start();
t2.start();
}
}
class Runner implements Runnable{
public void