Java-SE-线程

JavaSE-线程

今天就分享一下什么是线程


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


一、什么是线程

  任务管理器可以有多个进程,每个进程运行的都是可执行程序,一个可执行程序就是一个软件,可执行程序的本质就是在计算机当中运行的一块代码,一个进程下可以有多个线程来执行提高效率

进程:可以看成是在计算机当中运行的一块代码
线程:可以看成是在计算机当中运行的一小块代码

二、多线程下载软件为什么快

在这里插入图片描述

1)假设上面软件都是运行在同一台电脑上面,两款软件运行,肯定是由一个CPU在处理该任务
2)CPU处理任务最小单位是线程,CPU是通过资源分配的方式,在多个线程之间,以时间片(时间片:很微小的时间单位)为单位,高速切换内存中要执行的线程任务。
3)在同一个时间片上,只能处理一个线程
4)在CPU的眼中,只看到内存中有很多线程,大家都是平等的,获取到CPU处理的机会是均等的,CPU会平均分配资源给每一个线程
5)假设每个线程执行一分钟,快播软件占用CPU时间为三分钟,迅雷占用CPU处理任务的时间为1分钟,自然快播处理的任务会更多,下载的内容更多

2.创建线程的方式

1)方式一:继承Thread类

public class DownThread extends Thread{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 50; i++) {
			System.out.println("下载量!"+i);
		}
	}
}

2)方式二:实现Runnable接口

public class PlayRunnableImpl implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 50; i++) {
			System.out.println("播放!"+i);
		}
	}
}

3)实现

public class PlayCallableImpl implements Callable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 50; i++) {
			System.out.println("浏览!"+i);
		}
	}
}

3.线程启动方式

1.可以直接调用run方法,但是没有启动一个独立的线程;
2.只有调用start 才会启动一个独立的线程;

public static void main(String[] args) {
		// 创建线程的对象
		DownThread downThread = new DownThread();
		PlayThread playThread=new PlayThread(downThread);
		//启动线程
		playThread.start();
		try {
			//可以设置等待时间
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		downThread.start();

		PlayRunnableImpl playRunnableImpl = new PlayRunnableImpl();
		new Thread(playRunnableImpl).start();
	}

4.线程同步[解决线程安全问题]

为什么要解决喃,因为现在的线程是不安全的,容易有线程阻塞,导致死锁

1)线程同步方式一:同步代码

使用关键字synchronized在方法里面

private void sayOne() {
		synchronized (Thread.class) {
			
			if (count>0) {
				
				Thread currentThread = Thread.currentThread();
				String name2 = currentThread.getName();
				System.out.println(name2+"mai"+"票号"+count);
				count--;
			}
		}
	}

2)线程同步方式二:同步方法

在需要被同步的方法的在返回值类型的前面加关键字 synchronized

private static synchronized void sayOne() {
		
			
			if (count>0) {
				
				Thread currentThread = Thread.currentThread();
				String name2 = currentThread.getName();
				System.out.println(name2+"mai"+"票号"+count);
				count--;
			}
		
	}

3)线程同步方式三:锁机制

public class Ticket extends Thread {
	public Ticket(String name) {
		super(name);
	}
	static Lock lock = new ReentrantLock();//必须保证多个线程访问的是同一把锁
	static int num = 50;
	@Override
	public void run() {
		while(num > 0){//循环判断,是否有就卖
			lock.lock();
			try {
				if(num>0){//判断卖一张票的操作
					System.out.println(getName()+" 您的票号是:"+num);
					num--;
				}	
			} finally {
				lock.unlock();
			}	
		}
	}
}
为什么用线程

在一个程序启动时可以使多个功能同时运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值