Java线程的创建
方式一:继承Thread类
在Java中要实现线程,最简单的方式就是扩展Thread类,重写其中的run方法,方法原型如下:
Thread类中的run方法本身并不执行任何操作,如果我们重写了run方法,当线程启动时,它将执行run方法。
//线程创建方式一:继承Thread类
public class ThreadDemo extends Thread {
//重写run方法
//并将线程组需要执行的任务写在run方法里面
@Override
public void run() {
for (int i = 0; i < 1000; i++){
System.out.println("run:"+i);
}
}
}
测试类:
public class Test {
//在main方法中创建并启动其他线程
public static void main(String[] args) {
ThreadDemo td=new ThreadDemo();
//td.run();只是方法的调用,不是线程启动
td.start();//启动线程
for (int i = 0; i < 1000; i++) {
System.out.println("main:"+i);
}
}
}
方式二:实现Runnable接口
java.lang.Runnable接口中仅仅只有一个抽象方法:public void run(){}
也可以通过实现Runnable接口的方式来实现线程,只需要实现其中的run方法即可;
重写该方法即可(线程所执行的任务写在方法体中)
Runnable接口的存在主要是为了解决Java中不允许多继承的问题。
package com.ff.Javathread.day1.Demo2;
//创建线程方法2:实现Runnable接口
public class ThreadDemo implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
//Thread.currentThread()获得当前正在执行的线程
}
}
}
测试类:package com.ff.Javathread.day1.Demo2;
public class Test {
public static void main(String[] args) {
/*线程执行任务
MyThread r = new MyThread();
创建一个线程作为外壳,将r包起来,
Thread thread = new Thread(r);
thread.start();
*/
ThreadDemo td = new ThreadDemo();//创建一个线程任务
Thread t = new Thread(td, "创建的线程1");//创建一个启动线程的对象
t.setName("xxx");//设定线程的名字
t.setPriority(10);//设定线程的优先级,优先级大地有大概率优先执行,并不绝对
t.start();
Thread t2 = new Thread(td, "创建的线程2");
t2.setPriority(1);
t2.start();
for (int i = 0; i < 10; i++) {
System.out.println("main:" + i);
}
System.out.println(Thread.currentThread().getName());
//会产生多线程的交替执行
System.out.println(t.getPriority());
System.out.println(t2.getPriority());//获得线程的优先级
}
}
区别:实现接口时需要Thread thread = new Thread(进行包装)
方式二的好处:
多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。
Thread类的方法
一.构造方法
1.Thread();创建一个新线程
2.Thread(String name);创建一个新线程并为其命名
3.Thread(Runnable target)利用Runnable对象创建一个线程,启动时将执行该对象的run方法
用于包装
4.Thread(Runnable target,String name)利用Runnable对象创建一个线程并为其命名,启动时将执行该对象的run方法
二.常用方法
方法 | |
---|---|
void start() | 启动线程 |
final void setName(String name) | 设置线程的名称 |
final String getName() | 返回线程的名称 |
final void setPriority(int newPriority) | 设置线程的优先级 |
final int getPriority() | 返回线程的优先级 |
final void join()throws InterruptedException | 等待线程终止 |
static Thread currentThread() | 返回对当前正在执行的线程对象的引用 |
static void sleep(long millis)throws InterruptedException | 让当前正在执行的线程休眠(暂停执行),休眠时间由millis(毫秒)指定 |
线程优先级
对于计算机的cpu来说同一时间节点只能执行一个线程
所以说需要各个线程之间不断交替获得cpu的使用权
优先级用整数表示,取值范围是1~10,一般情况下,线程的默认优先级都是5,但是也可以通过setPriority和
getPriority方法来设置或返回优先级;
调度策略
1.时间片
2.抢占式:高优先级的线程抢占CPU
Java的调度方法
同优先级线程组成先进先出队列(先到先服务),使用时间片策略
默认优先级都是5,但是也可以通过setPriority和**
getPriority方法来设置或返回优先级;
调度策略
1.时间片
2.抢占式:高优先级的线程抢占CPU
Java的调度方法
同优先级线程组成先进先出队列(先到先服务),使用时间片策略
对高优先级,使用优先调度的抢占式策略