一.进程与线程
进程就是一个程序(例如打开QQ),线程就是所答开QQ中同时打开多个聊天窗口,各个进程都是独立的,而线程则不同,他们有时是可以进行数据共享的。
多线程就是同时执行多个线程(其实还是处理器逐个去执行)
二.使用多线程
使用多线程最常用的方法有两种:一是直接继承Thread 二是实现runnable接口
继承Thread:
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("Test");
}
public static void main(String[] args) {
MyThread mythread = new MyThread();
mythread.start();
}
}
此处要重写run方法,run方法中的程序就是在开启这条线程后要执行的代码块
实现runnable:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Test");
}
public static void main(String[] args) {
Runnable runnable=new MyRunnable();
Thread thread=new Thread(runnable);
thread.start();
}
}
此处也是写run方法的内容
实现runnable方法和Thread方法本质是有很大的区别的:
通过阅读Thread的源码我们可知,它的源码就是在构造时要传入一个runnable的实例对象,传递后在.start时要检查是否传递了runnable对象,如果没有就不能执行。所以直接new Thread的方法就是需要复写这个方法。
如果在构造Thread时候没有传递Runnable,或者没有复写Run那边了或者没有复写Thread的run方法,该Thread不会调用任何东西。使用Thread方法是要写run方法,实际上是在重写他父类中的run方法。
Runnable不是线程,他只是一个传递的接口,只有Thread是线程。
在这里我们还需要注意在创建Thread时有两个需要传入的参数:ThreadGroup stacksize
ThreadGroup:如果构造线程对象时,没有传入ThreadGroup,Thread会默认获取父线程中的ThreadGroup作为他自己的ThreadGroup,此时他和父线程在同一ThreadGroup中。
stacksize:构造Thread时传入stacksize表示当该线程占用的stack大小,没有指定stacksize的大小的话,默认为0, 0代表着会忽略该参数&#x