操作系统是系统软件,是用来管理应用软件和其它资源的,主要负责管理文件,内存,cpu等等,主要进行资源的分配,操作系统是计算机的管理者,另外操作系统中的驱动程序,用来驱动程序的执行.
进程是资源调度的最小单位,当创建一个新进程时,操作系统会为该进程分配资源,一个进程所占的资源是动态的…例如,如果给进程增加新的线程,因为线程资源共享,需要额外的资源很少,大部分都是使用之前的资源,操作系统只需要分配给该进程一点额外的资源即可.
线程是进行调度的最小单位,但是进程也是会进行调度的,进程的调度实现了计算机并发执行多个进程,并且提高了cpu的性能.线程的调度也提高了cpu的性能,但是线程的调度更好,因为线程的调度额外需要的资源也比较少,线程资源共享,进程资源不共享.
线程的数目不是越多越好,因为创建线程和销毁线程需要开销,如果线程数目过多反而会降低效率.
创建线程的几种方式:
1.继承Thread类
2.实现Runnable接口
匿名类实现上述两种:
区别:
并发:
并发分为进程并发和线程并发,主要研究线程并发.
线程并发是主要核心:
线程并发是抢占式执行,且操作系统内核怎么样安排线程并发程序员是不知道的,也是没有规律,无法预知.
线程的几种状态:
就绪状态时处于就绪队列中,阻塞状态时处于阻塞队列中
阻塞状态包括wait等待状态,sleep休眠状态,join状态,锁也会导致线程处于阻塞状态,锁导致的阻塞状态不能手动改变,不能中断,所以知道就行.
1.当线程正处于阻塞状态时,调用中断函数后当主线程的时间片执行完了,子线程才有机会重新获取时间片
2.当线程即将处于阻塞状态时,当线程运行到阻塞代码,阻塞后然后立马被中断,因为主线程已经执行过中断函数.
**中断线程的两种方式:**1.采用标记法
2.通过中断异常,捕获到异常则退出循环
第一种方法会将循环里的代码执行完,第二种方法会立即结束循环.
注意:第二种方法中,中断标记没有起作用,因为中断标志和异常同时存在,会默认给异常,中断标志一直为false,因为当线程即将进入阻塞状态或者正处于阻塞状态时中断标志位都不会被置为true,也会是说,当线程中有sleep,wait或者join代码时,中断标志位就不会被改变,只有当没有这三个方法时,中断标志才会被改变.第二个方法中中断标志并没有起作用,起作用的是异常捕获.代码:
package threaddemo;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;
class ThreadDemo2{
//中断线程第一种方法,采用标记法
static class MyRunnable implements Runnable {
boolean quit;
@Override
public void run() {
while (!quit) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是线程一,我正在执行");
System.out.println(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getId());
System.out.println(Thread.currentThread().isAlive());
}
System.out.println("出现问题,主线程让我停止执行");
}
}
public static void main(String[] args) throws InterruptedException {
MyRunnable r1 = new MyRunnable();
Thread t1 = new Thread(r1, "线程一");
t1.start();
Thread.sleep(10000);
System.out.println("我是主线程,我要停止线程一了");
r1.quit=true;
}
}
public class ThreadDemo1 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run() {
while(!Thread.interrupted()) {
while (!Thread.currentThread