多线程

3 篇文章 0 订阅

实现多线程的方式

线程依赖于进程而存在,进程由系统创建的,因此需调用系统功能创建一个进程,Java不能直接调用系统功能,所以没办法实现多线程技术,但是,Java可以调用C/C++写好的程序实现多线程,由C/C++去调用系统功能创建进程。提供一些类,由Java去调用。
1. 继承Thread类

		 1.1 自定义类继承Thread类
		 1.2 重写run()方法
		 1.3 创建对象
		 1.4 启动线程

run()方法:仅仅封装了线程执行的代码,直接调用是普通的方法。
start()方法:首先启动了线程,然后由JVM去调用该线程的run()方法。

线程的两种调度模型

1.分时调度,所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片。
2.抢占式调度模型:优先让优先级高的线程使用CPU,相同则随机选择一个,优先级高的线程获取的CPU时间片相对多一点。
Java默认使用抢占式调度模型
设置优先级的方式优先级(1-10)默认为5:

public class MyThread {
	
	public static void main(String[] args) {
		ThreadTest th1=new ThreadTest("th1");
		ThreadTest th2=new ThreadTest("th2");
		ThreadTest2 th3=new ThreadTest2("th3");
		th1.start();
		try {
			th1.join();//线程th1执行完成才执行下面的线程
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		th2.setPriority(10);//设置线程优先级
		th2.setDaemon(true);//设置为守护线程,当正在运行的线程都是守护线程,java虚拟机退出,该方法必须在启动前调用
		th2.start();
		th3.start();
	}
}

class ThreadTest extends Thread{
	public ThreadTest() {}
	public ThreadTest(String name) {
		super(name);
	}
	@Override
	public void run() {
		for(int i=0;i<200;i++) {
			try {
				Thread.sleep(10);//线程休眠MS
				System.out.println(getName()+"  "+i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
class ThreadTest2 extends Thread{
	public ThreadTest2() {}
	public ThreadTest2(String name) {
		super(name);
	}
	@Override
	public void run() {
		for(int i=0;i<100;i++) {
			Thread.yield();//交出执行权,执行更和谐,不能保证线程交替执行
		}
	}
}

线程方法:

  1. Thread.sleep(10);//线程休眠MS
  2. MyThread.join();//线程执行完毕,其他线程才能执行
  3. Thread.yield();//交出执行权,执行更和谐,不能保证线程交替执行。
  4. th2.setDaemon(true);//设置为守护线程

实现runnable接口

class ThreadTest3 implements Runnable{
	@Override
	public void run() {
			System.out.println(Thread.currentThread().getName());
	}
}

实现callable 接口

使用ExecutorService、Callable、Future实现有返回结果的多线程

class MyCallable implements Callable<Object> {
private String taskNumg;
 
MyCallable(String taskNumg) {
   this.taskNum = taskNumg;
}
 
public Object call() throws Exception {
   System.out.println(">>>" + taskNumg + "任务启动");
   Date dateTmp1 = new Date();
   Thread.sleep(1000);
   Date dateTmp2 = new Date();
   long time = dateTmp2.getTime() - dateTmp1.getTime();
   System.out.println(">>>" + taskNumg + "任务终止");
   return taskNumg + "当前任务时间【" + time + "毫秒】";
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值