进程: 正在运行的程序。每个进程可以由多个线程组成;
线程:是进程中的单个顺序控制流,是一条执行路径。
并行:指在某一个时间段内同时发生的事件 —时间段
并发:指在某一个时间点同时发生的事件 —时间点
一、实现多线程有2中方式
1.继承继承Thread类,重写run()方法,run()是包含被线程执行的代码
public class MyThread extends Thread {
public MyThread() {
super();
}
public MyThread(String name) {
super(name);
}
@Override
//run()用来包含那些被线程执行的代码。
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" :"+i);
}
}
}
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//设置线程名称
my1.setName("my1");
my2.setName("my2");
my1.start();
my2.start();
//打印当前线程名字
System.out.println(Thread.currentThread().getName());
输出:
main
my2 :0
my2 :1
my2 :2
my2 :3
my2 :4
my2 :5
my2 :6
my2 :7
my2 :8
my2 :9
my1 :0
my1 :1
my1 :2
my1 :3
my1 :4
my1 :5
my1 :6
my1 :7
my1 :8
my1 :9
2.实现Runnable接口,重写run()方法
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
}
public static void main(String[] args) {
// 创建MyRunnable类的对象
MyRunnable my = new MyRunnable();
Thread t1 = new Thread(my, "线程1");
Thread t2 = new Thread(my, "线程2");
t1.start();
t2.start();
//打印当前线程名字
System.out.println(Thread.currentThread().getName());
}
输出:
main
线程1:0
线程1:1
线程1:2
线程1:3
线程1:4
线程1:5
线程1:6
线程1:7
线程1:8
线程1:9
线程2:0
线程2:1
线程2:2
线程2:3
线程2:4
线程2:5
线程2:6
线程2:7
线程2:8
线程2:9
三、多线程的方法
测试功能的线程:
public class MyThread extends Thread {
@Override
public void run() {
for (int x = 0; x < 5; x++) {
System.out.println(getName() + ":" + x);
}
}
}
- public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.setName("线程1");
my2.setName("线程2");
// 设置守护线程
my1.setDaemon(true);
my2.setDaemon(true);
// Thread.currentThread().setDaemon(true);//当正在运行的线程都是守护线程时,Java 虚拟机退出。
my1.start();
my2.start();
for (int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
输出:
main:0
main:1
线程1:0
线程2:0
线程2:1
线程2:2
main:2
线程2:3
线程2:4
线程1:1
线程1:2
线程1:3
线程1:4
main:3
main:4
2.public final void join():等待该线程终止。
MyThread my1=new MyThread();
MyThread my2=new MyThread();
MyThread my3=new MyThread();
my1.setName("线程1");
my2.setName("线程2");
my3.setName("线程3");
my1.start();
try {
//等待该线程终止。 my1线程结束完才会执行下去
my1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
my2.start();
my3.start();
}
输出:
线程1:0
线程1:1
线程1:2
线程1:3
线程1:4
线程2:0
线程2:1
线程2:2
线程2:3
线程3:0
线程2:4
线程3:1
线程3:2
线程3:3
线程3:4
3.线程优先级:代表获取cpu时间片几率的高低.
public final int getPriority():返回线程对象的优先级
public final void setPriority(int newPriority):更改线程的优先级。
注意:
线程默认优先级是5。
线程优先级的范围是:1-10。
public static void main(String[] args) {
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
MyThread my3 = new MyThread();
my1.setName("线程1");
my2.setName("线程2");
my3.setName("线程3");
// 获取默认优先级
System.out.println("线程1优先级"+my1.getPriority());
System.out.println("线程2优先级"+my2.getPriority());
System.out.println("线程3优先级"+my3.getPriority());
//设置正确的线程优先级
my1.setPriority(10);
my3.setPriority(1);
System.out.println("线程1优先级"+my1.getPriority());
System.out.println("线程2优先级"+my2.getPriority());
System.out.println("线程3优先级"+my3.getPriority());
System.out.println("------------------测试---------------");
my1.start();
my2.start();
my3.start();
}
}
输出:
线程1优先级5
线程2优先级5
线程3优先级5
线程1优先级10
线程2优先级5
线程3优先级1
------------------测试---------------
线程1:0
线程1:1
线程3:0
线程1:2
线程1:3
线程1:4
线程2:0
线程2:1
线程2:2
线程2:3
线程2:4
线程3:1
线程3:2
线程3:3
线程3:4
4.线程休眠 public static void sleep(long millis),此时线程会停止,等时间过了,在继续
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
MyThread my3 = new MyThread();
my1.setName("线程1");
my2.setName("线程2");
my3.setName("线程3");
my1.start();
my1.sleep(3*1000);
System.out.println("线程1结束完了");
my2.start();
my3.start();
输出:
线程1:0
线程1:1
线程1:2
线程1:3
线程1:4
线程1结束完了
线程2:0
线程3:0
线程2:1
线程3:1
线程2:2
线程3:2
线程2:3
线程3:3
线程2:4
线程3:4
5线程停止
public void interrupt():中断线程。如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.setName("线程1");
my2.setName("线程2");
my1.start();
//中断线程状态
my1.interrupt();
//中断线程状态
System.out.println(my1.interrupted());
System.out.println("线程1结束完了");
my2.start();
输出;
false
线程1结束完了
线程1:0java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at cn.itcast_04.MyThread.run(MyThread.java:8)
线程2:0
线程1:1
线程2:1
线程1:2
线程2:2
线程1:3
线程2:3
线程1:4
线程2:4
6.public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
public class MyThread extends Thread {
@Override
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println(getName() + ":" + x);
Thread.yield();
}
}
}
MyThread ty1 = new MyThread();
MyThread ty2 = new MyThread();
ty1.setName("线程1");
ty2.setName("线程2");
ty1.start();
ty2.start();
输出:
线程1:0
线程2:0
线程1:1
线程2:1
线程2:2
线程2:3
线程2:4
线程2:5
线程1:2
线程2:6
线程1:3
线程1:4
线程2:7
线程1:5
线程2:8
线程2:9
线程1:6
线程1:7
线程1:8
线程1:9