首先,什么是多线程。我的理解是多线程就是多个线程同时进行(实际上应该是一个线程来回切换)。比如说买火车票,好几个人同时购买火车票,每一个人购买火车票都是一个线程,多个人同时购买自然就是多线程了。
说到线程,有一个与之相关的概念叫做进程。所谓进程,就是对于程序的一次执行的过程。还是以买火车票为例,买火车票就是进程,因为他要执行买火车票的这个程序。然后呢,一个进程可以有多个线程,但至少得有一个线程,不然就没有意义了。你可以多个人同时买火车票,但起码要有一个人买,不然没人买票跑程序干嘛呢?
对于线程,一般来说有三种创建的方法。第一是继承Thread类,第二种是实现Runnable接口,最后一种是实现Callable接口。
首先是继承Thread类,这个有三步。
第一步是自定义线程继承Thread类
第二步是重写run()方法
第三步是创建线程对象,调用start()方法启动线程
以我写的这个为例
package Demo02;
public class ThreadExample extends Thread{
@Override
public void run() {
Print print=new Print();
for (int i = 0; i < 3; i++) {
print.print(i);
}
}
public static void main(String[] args) {
ThreadExample t1=new ThreadExample();
ThreadExample t2=new ThreadExample();
ThreadExample t3=new ThreadExample();
t1.start();
t2.start();
t3.start();
}
}
class Print{
public void print(int i){
System.out.println(i);
}
}
运行以后的结果如图
然后是实现Runnable接口
同样是分为三步
第一步是自定义一个类实现Runnable接口
第二步是实现run()方法
第三步是创建线程对象,调用start()方法启动线程
以此为例:
package Demo02;
public class RunnableExample implements Runnable{
private String name;
public RunnableExample(String name){
this.name=name;
}
@Override
public void run() {
Print1 print=new Print1();
print.print(name);
}
public static void main(String[] args) {
RunnableExample t1=new RunnableExample("小红");
RunnableExample t2=new RunnableExample("小蓝");
RunnableExample t3=new RunnableExample("小黄");
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
}
}
class Print1{
public void print(String name){
System.out.println(name);
}
}
总的来说,我觉得实现Runnable接口是比继承Thread类要好的,其中有一个很关键的点就是实现Runnable接口可以避免单继承局限性,可以同一个对象被多个线程使用,如下例子:
package Demo02;
public class TestThread implements Runnable{
private int num=10;
@Override
public void run() {
while (true){
if (num<=0){
break;
}else{
System.out.println(Thread.currentThread().getName()+"获得第"+num--+"张票");
}
}
}<