1. 进程个线程的区别
进程:系统程序运行的最小单位,一个程序至少有一个进程:系统会在内存中开辟一块空间用来运行程序。
线程:程序执行任务的最小单位,线程不能单独存在,必须存在与进程中,一个进程中至少包含一个线程。
2. 创建和启动线程的两种方式
创建线程的方式一:
[public] class 类名 implements Runnable{
//重写run方法
}
创建对象: 类名 对象名 = new 类名();
启动线程 Thread t = new Thread(对象名);
启动: t.start(); // 启动线程调用的是start方法,而不是run方法。
原因:因为Runnable接口中没有start方法,所以需要创建thread类的对象来调用里面的start方法。
小案例:
通过实现Runnable接口,创建线程
package com.runnable.thread;
/** @version 2017-9-7 上午9:27:46 */
public class MyRunnable implements Runnable{
/**
* 重写run方法:
* 线程启动之后会执行run方法
* run方法的代码就是线程所要执行的任务*/
@Override
public void run(){
System.out.println("线程启动了");
System.out.println("线程开始运行了");
}
}
测试通过实现接口创建的线程
package com.runnable.thread;
/**@version 2017-9-7 上午9:31:58*/
public class TestMyRunnable {
public static void main(String[] args){
MyRunnable myRunnable = new MyRunnable();
//创建线程对象
Thread thread = new Thread(myRunnable);
//启动线程,调用start方法,实际运行run方法
thread.start();
}
}
解析:为什么线程的启动需要通过线程对象.start()( 例如:thread.start() )方法来启动而不是线程所在类的对象.run()( 例如myRunnable.run() )方法来运行线程?因为通过线程对象.start()方法来运行的线程是由启动这个线程的线程来执行,但是通过myRunnable.run()运行的线程是由主线程(main线程)来执行的。
创建线程的方式二:(推荐使用)
[public] class 类名 extends Thread{
//重写run() 方法
}
创建对象: 类名 对象名 = new 类名();
启动线程:对象名.start();
原因: 线程直接继承了Thread类,所以他的对象里面就包含了start方法,所以不需要创建thread类的对象来调用里面的start方法,而是通过”线程对象.start()”可以直接调用里面的方法。
小案例:
通过继承Thread类,创建线程
package com.thread.thread;
/** @version 2017-9-7 上午9:59:03*/
public class MyThread extends Thread{
//重写run()方法
//通过Alt+/ 可以提示从父类中继承了那些成员
//需要注意:不能重写start方法,因为start方法需要为线程开辟空间
@Override
public void run() {
System.out.println("通过继承thread方法执行了");
}
}
测试通过继承Thread类创建的线程
package com.thread.thread;
public class TestMyThread {
public static void main(String[] args){
//创建线程对象
MyThread thread = new MyThread();
//启动线程
thread.start();
}
}
解析:与上面的解释相同