最近,想弄一个雪花飘落,结果,搞了两三个小时没弄出来。主要是雪花飘落可能需要用到线程。有人是通过一个雪花去实现,然后通过集合去实现漫天雪花。不管怎么说,做开发,可能线程学习也是一块绕不过去的大山。
进程是正在运行的程序。 举例:Windows任务管理器中的进程

线程:进程中单个顺序控制流,是一条执行路径。
单线程:一个进程如果只有一条执行路径,则称为单线程程序。举例:记事本程序
多线程:一个进程如果有多条执行路径,则成为多线程程序 举例:扫雷程序
线程是程序中执行的线程。 Java虚拟机允许应用程序同时执行多个执行线程。
将一个类声明为一个Thread的子类。 这个子类应该重写run类的方法Thread 。 然后可以分配并启动子类的实例。
简述就是:
public class MyThread extends Thread{@Overridepublic void run() {for(int i=0;i<100;i++){System.out.println(i);}}
}
public class MyThreadDemo {public static void main(String[] args) {MyThread my1=new MyThread();MyThread my2=new MyThread();my1.run();my1.run();System.out.println("\n");my1.start();my2.start();}
}

问题:
- 为什么要重写run()方法?
因为run()是用来封装被线程指向的代码
- run()方法和start()方法的区别?
run():封装线程执行的代码,直接调用,相当于普通方法的调用。
start():启动线程;然后由虚拟机调用此线程的run()方法。
声明一个实现Runnable接口的类。 那个类然后实现了run方法。 然后可以分配类的实例,在创建Thread时作为参数传递,并启动。
public class MyRunnable implements Runnable{@Overridepublic void run() {for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+":"+i);}}
}
public class MyRunnableDemo {public static void main(String[] args) {//创建对象MyRunnable my=new MyRunnable();Thread t1=new Thread(my);Thread t2=new Thread(my);t1.start();t2.start();}
}
小结:多线程实现方式有两种: 1.继承Thread类 2.实现Runable接口
相比于继承Thread类,实现Runnable接口的好处
- 避免java单继承的局限性
- 适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码,数据有效分离,较好的体现了面向对象的设计思想。
public class MyThread extends Thread{@Overridepublic void run() {for(int i=0;i<100;i++){System.out.print(getName()+":"+i+" ");}}
}
测试类保持不变,最后运行得

public class MyThreadDemo {public static void main(String[] args) {MyThread my1=new MyThread();MyThread my2=new MyThread();
//获取当前正在运行的线程对象的名称System.out.println(Thread.currentThread().getName());}
}