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();
}
}
}
}
为什么用线程
在一个程序启动时可以使多个功能同时运行