咱们接着来。
进程和线程的区别:
- 进程:有独立的内存空间,进程中的数据存放空间(堆,栈)是独立的,但是至少包含一个线程。
- 线程:堆空间是共享的,栈空间是独立的。线程消耗资源比进程小,相互之间可以影响,又被称为轻型的或微观的进程。
多线程的并发:
现在知道在一个进程中有多个线程,宏观上多个线程同时运行,微观上面有先后顺序的。哪一个线程先被执行,完全取决于cpu的调度。所有我们可以把多线程的并发,看出是多线程在瞬间抢占cpu的资源,谁抢到谁运行。这也就造成了多线程的随机性。
而多线程作为一种多任务,并发的工作方式有什么优势?
- 提高应用程序的响应。
- 使多个cpu(多核)更加有效。OS会保证当线程不大于cpu的数目时,不同的线程运行于不同的cpu上。
- 改善程序结构。
创建线程和启动线程 :
1.继承java.lang.Thread类
public class ThreadTestone {
public static void main(String[] args) {
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
t1.start();
t2.start();
}
}
class ThreadOne extends Thread{
public void run(){
System.out.println("我是one线程");
}
}
class ThreadTwo extends Thread{
public void run(){
System.out.println("我是two线程");
}
}
2.实现Runnable接口
public class ThreadTesttwo {
public static void main(String[] args) {
RunThread t = new RunThread();
Thread t1 = new Thread(t,"one");
Thread t2 = new Thread(t, "two");
t1.start();
t2.start();
}
}
class RunThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"我是线程");
}
}
对比一下继承和实现类创建线程的区别!
- 从完成功能上来看,两个都能实现。
- 从简单易用方面来看,继承方式更为简单。
- 继承方式无法共享同一份资源,而实现接口可以
- 在java中类是单继承的,但是接口可以多实现,所以接口更方便。
若:在2种场景之下只能使用runnable。
- 该类还需要继承其他类。
- 多个线程需要访问同一资源。
多线程会出现并发问题:多个线程并发访问同一个资源的时候,可能会出现线程安全的问题。 下一章来说。