线程和进程:
进程是指程序的动态执行全过程,每个进程的内存空间都是独立的,拥有自己的堆栈,可以理解为不同的应用。线程是比进程更小的单位,多线程是指一个进程在执行过程中可以产生多个更小的线程,这些线程可以同时存在,同时运行。举个例子:你电脑可能同时在运行不同的软件,假如你开一个QQ那么QQ就是一个进程,你用qq和别人说话或者斗图就是不同的线程。
同步异步:
当不同的执行者同时想要操作一个方法或更改同一个变量的时候,同步就是排队去执行,效率低但是安全;异步就是同时执行,效率搞,但是不安全。
并发并行:
并发:指的是两个或多个事情在指定的时间段内同时发生的事情。并行:同时发生,同时进行。这里我理解的是,并发不一定是同一时刻,可能是今天发生的事情,而并行则是同一时刻时发生。
实现多线程:
一种是继承 Thread 类,另一种就是实现 Runnable 接口(还有一种callable)。
继承Thread:
public class Test extends Thread{
public static void main(String[] args) {
Demo demo1=new Demo();
Demo demo2=new Demo();
demo1.start();
demo2.start();
}
}
class Demo extends Thread{
@Override
public void run() {
for(int i=0;i<3;i++){
System.out.println("hello"+i+Demo.currentThread().getName());
}
}
}
结果:
hello1Thread-1
hello2Thread-1
hello0Thread-0
hello1Thread-0
hello2Thread-0
可以看到,在你没有指定线程名称的时候系统会自动给线程命名,然后线程执行的顺序是随机的,看谁先抢到谁就先执行。
实现Runnable:
public class Test{
public static void main(String[] args) throws InterruptedException {
Demo demo1=new Demo();
Demo demo2=new Demo();
Thread mythread1=new Thread(demo1);
Thread mythread2=new Thread(demo2);
mythread1.start();
mythread2.start();
}
}
class Demo implements Runnable{
@Override
public void run() {
for(int i=0;i<3;i++) {
System.out.println("hello" + i);
}
}
}
其实和Thread没啥差别,但是实现runnable更适用于多个线程同时执行相同任务的情况,避免了单继承的局限性,使任务线程分离,程序更健壮,并且后续学习的线程池,不接受Thread的线程。
Thread类里面的方法不多讲了,自己看api吧,应该还挺好懂的。