1. 什么是进程?
正在运行中的应用程序,通常称为进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。
2.什么是线程?
(main函数是线程、Thread t=new Thread()。出来的是线程,正常的情况下的方法不是线程。).
线程是一个轻量级的子进程,是最小的处理单元;是一个单独的执行路径。可以说:线程是进程的子集(部分)。
3.线程特点:
线程是独立的。如果在一个线程中发生异常,则不会影响其他线程。它使用共享内存区域。
4.进程和线程的区别:
1、容易创建新线程。但是,创建新进程需要重复父进程。
2线程可以控制同一进程的其他线程**。进程无法控制兄弟进程,只能控制其子进程。
3、进程拥有自己的内存空间。线程使用进程的内存空间,且要和该进程的其他线程共享这个空间;而不是在进程中给每个线程单独划分一点空间。
4、(同一进程中的)线程在共享内存空间中运行,而进程在不同的内存空间中运行。
5、线程可以使用wait(),notify(),notifyAll()等方法直接与其他线程(同一进程)通信;而,进程需要使用“进程间通信”(IPC)来与操作系统中的其他进程通信。
5.多任务和线程:
多任务是指在系统中同时运行多个程序,如果只有一个处理器只有一个进程的一个指令被执行,可以使这些程序进行交替执行,由于间隔的时间短,这些程序看上去好像在同时运行.
如果将进程划分为线程,每个线程轮流占用处理器,可以减少并发时间.
(一)、线程(Thread)
1.线程的创建:
为什么要创建线程?
为了将进程划分为线程,要在程序中创建多个线程对象(java.lang.Thread)
2.线程的构造方法:
3.线程的成员方法:
4.静态成员函数:(调用的时候要用类名)
5.线程的创建:
在Java中,每个程序至少自动拥有一个主线程。如果需要使用其他线程,采用以下两种方式进行创建新的线程。
第一种:
继承(Thread)类,用它覆盖类方法中的run()方法.
import java.sql.SQLOutput; import java.util.*; import java.awt.*; import java.lang.Math; public class hello extends Thread { public void run(){ for(int i=0;i<10;i++){ System.out.println(currentThread().getName()+i); } } public static void main(String []avgs) { System.out.println(activeCount()); //当前线程活跃数目 hello h1=new hello(); //创建新线程 hello h2=new hello(); //创建新线程 h1.start(); //导入线程 h2.start(); //导入线程 //Thread.currentThread().getThreadGroup().list(); } }
第二种:
编写一个类,使它实现java.lang.Runnable接口,然后在Thread构造函数中使用它.
import java.sql.SQLOutput; import java.util.*; import java.awt.*; import java.lang.Math; public class hello implements Runnable { public void run(){ for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+" "+i); //线程对象调用 } } public static void main(String []avgs) { System.out.println(Thread.activeCount()); //当前线程活跃数目 hello h1=new hello(); //接口对象 Thread t1=new Thread(h1); //把接口得对象传递给线程 hello h2=new hello(); //接口对象 Thread t2=new Thread(h2);//把接口得对象传递给线程 t1.start(); //导入线程 t2.start(); //导入线程 //Thread.currentThread().getThreadGroup().list(); //得到调用线程的列表 } }
(二)、线程的生命周期
创建(new)—>就绪(start)—>运行中(调度)------->死亡(run()结束)
阻塞:
1.等待阻塞: 运行中 调用(wait())函数的时候,如果调用notify()或则notifyAll() 就解除当前的阻塞进入到 就绪阶段.
2.互斥阻塞:运行中 调用synchronized()函数,试图获得某个对象的同步锁,如果该对象的同步锁已经被其他占用,则该线程被放入锁池中.
3.其他阻塞: 运行中 调用sleep()函数,join()方法
(三)、线程的优先级和调度:
线程的优先级范围i是1~10,最低是1,最高是10,默认是5.
获得优先级:
getPriority() //用于获得线程的优先级
设置优先级
setPriority() //用于设置优先级
1.线程的调度采用占先原则
2.相同优先级的线程,有分时和独占两种调度方式.
(四)、异常处理
1.error类:
包括了一些严重的。程序不能处理的系统错误,如同有内存不足,虚拟机错误、栈溢出等。这类错误主要由硬件问题引起的,与程序无关。
2.Exception类
Exection类及其子类都是程序因考虑不周或不可控因素导致的错误,根据编译器是否对某类异常进行检查,Expection类分为非受检异常(运行异常)和受检异常(需要程序员处理)两种。
3.异常处理步骤:
try{}
可能出现的异常语句块,可能有错误,也可能没有错误。当try子句中的某个语句发生异常后,产生异常对象,终止当前正在执行的语句,后面的语句将不再执行,然后抛出异常对象
catch{}
根据try{}抛出的异常对象,那么catch进行从上倒下一直捕捉异常对象,进行一直捕捉,直到找到为止
finnaly{}
无论是否异常,finnaly子句依然正常执行
try{ } catch(异常类型1, 异常对象){ //处理类型1 (拆弹专家1) } catch(异常类型2, 异常对象){ //处理类型2 (拆弹专家2) } finally{ 无论出现异常都要抛出 }
4.举列子:
错误信息:
捕捉错误:
手动修改错误: