1. 进程:正在运行的程序多进程的意义:提高CPU的使用率
线程:进程的执行单元,执行路径
单线程:一个应用程序只有一条执行路径
多线程:一个应用程序有多条执行路径 意义:提高应用程序的使用率
2. 多线程的实现方案:
A:继承Thread类
/*
* java实现一个多线程的程序:继承Thread类
* 子类要实现一个run()方法,因为并不是所有的代码都要被线程执行,run()里面的代码是要被执行的
*/
public class MyThread1 extends Thread {
public MyThread1(){
}
public MyThread1(String name){
super(name);
}
@Override
public void run() {
for(int i=1;i<100;i++){
//System.out.println(getName()+"---"+i);
System.out.println(getName()+"---"+i+ new Date());
//睡眠功能:
try {
sleep(1000);//睡眠一秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//创建线程对象
MyThread1 mt=new MyThread1();
MyThread1 mtt=new MyThread1();
//为线程设置名字
mt.setName("HUO_1");
mtt.setName("HUO_2");
//启动线程
mt.start(); mtt.start();
B:实现Runnable接口
public class RunnableDemo implements Runnable{
//run()方法里是需要被执行的代码
@Override
public void run() {
for(int i=0;i<=100;i++){
//这里要得到线程的名字,必须调用Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
public static void main(String[] args) {
// Thread(Runnable target) 分配新的 Thread 对象。
// RunnableDemo是实现了Runnable接口的类
RunnableDemo rd = new RunnableDemo();
// 创建线程对象
Thread t1 = new Thread(rd);
Thread t2 = new Thread(rd);
// 为线程对象设置对象
t1.setName("H");
t2.setName("F");
//设置线程名称的第二种方式
// Thread t1=new Thread(rd,"H");
// Thread t2=new Thread(rd,"F");
// 启动线程
t1.start();
t2.start();
}
3.
多线程安全问题的原因:
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句执行共享数据
4. 解决多线程安全的方法:
A:同步代码块
格式:synchronized(锁对象){
需要被同步的代码 }
B:同步方法 格式是: synchronized写在方法名上面,注意锁对象是this
静态同步方法: 锁对象是当前类的字节码文件对象,即 .class 文件
5. 并行和并发的区别:
前者是逻辑上同时发生,指在某一个时间内同时运行多个程序
后者是物理上同时发生,指在某一个时间点内同时运行多个程序
6. run()和start()的区别:
run()方法:仅仅是封装被线程执行的代码,直接调用相当于普通方法
start(): 首先是启动线程,然后由JVM去调用该线程的run()方法