线程依赖于进程而存在的,先了解进程才能指定线程,知道线程才能理解多线程。
进程是正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有自己的内存空间和系统资源。
线程是程序的执行单元,程序使用CPU的基本单位,一个进程可以执行多个线程。
单线程程序只有一条执行路径。
多线程可以执行多条执行路径。
多线程存在的意义是:抢占CPU使用资源和执行权。
Java不能直接调用系统的创建进程的功能,如果要实现多线程,只能调用C/C++写好的类供我们使用。
Java提供了以下两种方法实现多线程:
- 继承Thread类
步骤:
1.定义一个类去继承与Thread
2.在定义类重写run()方法
因为run()才是线程运行的核心方法。
不是类中的所有代码都需要被线程执行。
Thread类中的run()用来包含那些线程执行的代码。
3.创建对象
4.启动线程
用代码来举例:
public class MyThreadDemo{
public static void main(String[] args){
MyThread myThread = new MyThread(); //创建线程对象
myThread.setName("线程1"); //给线程set入名字
myThread.start(); //开启线程
MyThread myThread2 = new MyThread();
myThread2.setName("线程2");
myThread2.start();
}
}
//创建一个类,继承Thread
public class MyThread extends Thread{
public void run(){
for (int i =0 ; i < 10;i++){
Sysotem.out.println(Thread.currentThread().getName()+i);
//Thread.currentThread().getName() 是获得当前线程的名称
}
}
}
-
实现Runnable接口
A.自定义类MyRunnable实现Runnable接口
B.重写run()方法
C.创建MyRunnable类的对象
D.创建Thread类的对象,并把步骤C的对象作为构造参数传递public class MyRunnableDemo {
public static void main(String[] args) { MyRunnable my = new MyRunnable(); //新建线程对象 Thread t1 = new Thread(my, "床前明月光"); //第一个参数是 线程名,第二个是线程的名字 t1.start(); Thread t2 = new Thread(my, 疑似地上霜"); t2.start(); } } public class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+i); //获得当前线程的名字 try { Thread.sleep(1000); //暂停1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }
- 匿名内部类的形式实现线程
-
// 继承thread类实现多线程 new Thread() { public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + "--" + x); } } }.start(); ; // 实现runnable借口,创建多线程并启动 new Thread(new Runnable() { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + "--" + x); } } }) { }.start();
//这里创建一个线程的暂停的栗子
public class ThreadSleepDemo{
public static void main(String[] args){
ThreadSleep sleep = new ThreadSleep();
sleep.setName("VIP线程");
sleep.start();
}
}
//创建一个类,继承Thread
public class ThreadSleep extends Thread{
public void run{
for(;;){
System.out.println(getName()+new Date()); //打印 获得线程的名字和显示时间
}
Thread.sleep(2000); //暂停的方法,2000是毫秒值,等于2秒钟
}
}