线程
来源:互联网 发布:取名软件推荐 编辑:程序博客网 时间:2024/05/17 07:03
进程: 正在运行的程序。每个进程可以由多个线程组成;
线程:是进程中的单个顺序控制流,是一条执行路径。
并行:指在某一个时间段内同时发生的事件 —时间段
并发:指在某一个时间点同时发生的事件 —时间点
一、实现多线程有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:0main:1线程1:0线程2:0线程2:1线程2:2main:2线程2:3线程2:4线程1:1线程1:2线程1:3线程1:4main:3main: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
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- XFire使用举例
- swift中关于tableView中的cell实现不复用
- 单例模式
- 城市问题-SSL 1761
- Camel框架的快速认识和使用
- 线程
- 测试本机JVM支持的最大内存
- rpmlib(PayloadIsLzma) <= 4.4.6-1 is needed
- redis主动向页面push数据
- 我写的ant编译、打包、测试、测试报告生成和邮件发送模板
- 每天一个小题目——喷水装置
- 【java基础】 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO
- ant中使用cobertura分析测试用例的代码覆盖率
- redis学习笔记——不仅仅是存取数据