进程
需要通过系统分配,具有独立性和互斥性
线程
线程是组成进程的最小基本单位,每个进程至少得有一个线程
线程具有的特性
1.抢占式运行
CPU在执行的时候,是按照时间片执行的,单位时间片是相互抢占的
2.资源共享性
Java程序
一个java程序就是一个进程 Demo1main主函数 属一个应用程序
一个java应用程序至少有两个线程:
1.main主函数线程
2.jvm 垃圾回收线程
接下来是一个面试题
进程和线程的区别
进程是一个完整的程序
线程是进程里面的执行的一个功能。
一个应用程序是由多个线程组成的
进程申请是系统的资源
线程申请是进程的资源
多个线程在执行的时候,cpu会根据每个线程分配的时间片聊来随机抢占执行
每个线程最多占用的时间片大概是20ms,过了时间片,就切换到其他线程了
并发和并行
并发:同时发生,轮流交替执行
并行: 真正意义上的同时进行
创建线程的两种方式
第一种方式
Thread类:
1.声明一个Thread子类,重写run方法
2.调用start开启线程
class MyThread1 extends Thread {
@Override
public void run() {
//for循环
for (int i = 0; i < 100; i++) {
System.out.println("我是Mythread1线程里面的代码");
}
}
}
class MyThread2 extends Thread {
@Override
public void run() {
//for循环
for (int i = 0; i < 100; i++) {
System.out.println("我是Mythread2线程里面的代码");
}
}
}
public class Demo1 {
public static void main(String[] args) {
//main一个线程
//实例化出来一个线程对象
MyThread1 myThread1 = new MyThread1();
//通过调用start方法开启线程一定是start方法
myThread1.start();
MyThread2 myThread2 = new MyThread2();
myThread2.start();
//4个线程 2个myThread 1main 1jvm 垃圾回收器
for (int i = 0; i < 100; i++) {
System.out.println("我是main主函数线程");
}
}
}
第二种方式(开发中会用)
1.写一个类去实现Runnable接口,实现run方法
2.实例化Thread类,然后构造器的参数是一个实现Runnable接口的对象
class MyThread4 implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
System.out.println("MyThread" + i);
}
}
}
public class Demo2 {
public static void main(String[] args) {
//第二种写法
Thread thread = new Thread(new MyThread4());
thread.start();//开启线程
for (int i = 0; i < 100; i++) {
System.out.println("main:" + i);
}
}
}
6.线程下面的方法
构造方法:
Thread()
分配一个新的Thread
对象。Thread(Runnable target)
分配一个新的Thread
对象。Thread(Runnable target, String name)
分配一个新的Thread
对象。 并对当前线程起个名字哦
成员方法:
static Thread currentThread();获取当前线程对象
String getName();获取当前线程名字的
void setName(String name);设置当前线程的名字
void setPriority(int newPriority);设置当前线程的优先级。这个优先级只会增加线程执行的概率
但是真正的会不会优先不一定。int类型的参数,所有线程默认的优先级是5 传值 1-10 1的优先级是最低的,10优先级是最高的
int getPriority();获取当前线程优先级的
现在大家想一个问题,线程不可控,乱抢。怎么解决这样的问题呢?现在的解决方案让其睡会,就不抢占了
static void sleep();让线程休眠多少毫秒
可以让线程睡一会儿来控制线程的执行的先后顺序的
在run方法中调用Thread.sleep();只能try-catch不能抛