最近,想弄一个雪花飘落,结果,搞了两三个小时没弄出来。主要是雪花飘落可能需要用到线程。有人是通过一个雪花去实现,然后通过集合去实现漫天雪花。不管怎么说,做开发,可能线程学习也是一块绕不过去的大山。
一.线程和进程
1.什么是进程?
进程是正在运行的程序。 举例:Windows任务管理器中的进程
- 是系统进行资源分配和调用的独立单位
- 每一个进程都有它自己的内存空间和系统资源。
2.什么是线程?
线程:进程中单个顺序控制流,是一条执行路径。
单线程:一个进程如果只有一条执行路径,则称为单线程程序。举例:记事本程序
多线程:一个进程如果有多条执行路径,则成为多线程程序 举例:扫雷程序
-
线程是程序中执行的线程。 Java虚拟机允许应用程序同时执行多个执行线程。
二..线程的创建方式
实现方式一:继承Thread类
将一个类声明为一个Thread
的子类。 这个子类应该重写run
类的方法Thread
。 然后可以分配并启动子类的实例。
简述就是:
- 定义一个类MyThread继承Thread类
- 在My Thread类中重写run()方法
- 创建My Thread类的对象
- 启动线程
public class MyThread extends Thread{
@Override
public 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()方法。
实现方式二: 实现Runable接口
-
声明一个实现
Runnable
接口的类。 那个类然后实现了run
方法。 然后可以分配类的实例,在创建Thread
时作为参数传递,并启动。
public class MyRunnable implements Runnable{
@Override
public 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{
@Override
public 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());
}
}