并行和并发
并行:指两个或多个事件在同一时刻点发生;
并发:指两个或多个事件在同一时间段内发生。
进程和线程
进程与线程的区别
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,每一个进程至少有一个线程。
线程:堆空间是共享的,栈空间是独立的。线程消耗的资源比进程小。
多进程:操作系统中同时运行的多个程序。
多线程:一个进程同时运行多个任务。
线程调度
只有一个CPU时,在任意时刻只能执行一条计算机指令,每一个进程只有获得CPU的使用权才能执行指令。在可运行池中,会有多个线程处于就绪状态等待CPU.JVM负责了线程的调度。
JVM采用的是抢占式调度,没有采用分时调度。
多线程优势
1、线程可以共享堆内存
2、创建线程系统开销小
3、Java语言本身内置多线程功能的支持
严格来讲,多线程并不是提高了程序的运行效率,而是通过提高资源的使用效率来提高系统的效率。
Java操作进程
在java中如何运行一个进程
方式1:Runtime的exec方法。
方式2:ProcessBuilder的start方法。
例子:
//在java中简单获取一个进程
/**
* 需求 : 运行记事本程序
*
* 方式1 :Runtime类的exec方法
* 方式2 :ProcessBuilder的start方法
*
*/
public class ProcessDemo {
public static void main(String[] args) throws IOException{
// 方式1 Runtime类的exec方法
Runtime runtime = Runtime.getRuntime();
runtime.exec("notepad");
// 方式2 ProcessBuilder的start方法
ProcessBuilder bp = new ProcessBuilder("notepad");
bp.start();
}
}
创建并启动线程
线程常考面试题
1、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?
有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口。
new Thread(){
public void run(){
}
}.start();
new Thread(new Runnable(){
public void run(){
}
}
).start();
## 2、sleep() 和 wait()区别 ## sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间, 把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep **不会释放 对象锁**。 wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程**放弃对象锁**,进入 等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入 对象锁定池准备获得对象锁进入运行状态。 ## 单例模式 ##
//单例模式- 饿汉式
class ArrayUtil {
private static final ArrayUtil instance = new ArrayUtil();
private ArrayUtil() {
}
public static ArrayUtil getInstance() {
return instance;
}
public void work() {
System.out.println("工作");
}
}
//单例模式- 懒汉式
class ArrayUtil2{
private static ArrayUtil2 instance = null;
public static ArrayUtil2 getInstance(){
if(instance == null){
instance = new ArrayUtil2();
}
return instance;
}
public void work(){
System.out.println("工作");
}
}