进行运行的程序叫做进程,进程是系统分配资源的基本单位。使用PID来区分进程。
什么线程?线程是进程中的一条执行路径,也是CPU的基本调度单位。一个进程由一个或多个线程组成,彼此间完成不同的工作,同时执行,称为多线程。
进程和线程之间的区别–面试题- 进程是 *** 作系统资源分配的基本单位,而线程是CPU的基本调度单位。
- 一个程序运行后至少有一个进程。
- 一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义。
- 进程间不能共享数据段地址,但是同进程的线程之间可以。
为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO *** 作时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等
单核时代: 在单核时代多线程主要是为了提高 CPU 和 IO 设备的综合利用率。举个例子:当只有一个线程的时候会导致 CPU 计算时,IO 设备空闲;进行 IO *** 作时,CPU 空闲。我们可以简单地说这两者的利用率目前都是 50%左右。但是当有两个线程的时候就不一样了,当一个线程执行 CPU 计算时,另外一个线程可以进行 IO *** 作,这样两个的利用率就可以在理想情况下达到 100%了。
多核时代: 多核时代多线程主要是为了提高 CPU 利用率。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,CPU 只会一个 CPU 核心被利用到,而创建多个线程就可以让多个 CPU 核心被利用到,这样就提高了 CPU 的利用率。
(1)通过继承Thread类 //继承Thread类 public class MyThread extends Thread { //②重写run方法 @Override public void run() { for(int i=0;i<30;i++){ System.out.println("线程:"+i); } } } public class TestThread { public static void main(String[] args) { MyThread my1=new MyThread();//创建一个线程对象。 my1.start(); //开启线程 当前线程就和main线程同时争夺cpu时间片 for (int i = 0; i < 30; i++) { System.out.println("main线程:"+i); } } }为线程起名以及获取线程名称
1.获取线程名称.
[1]this.getName()必须是Thread得子类
[2]Thread.currentThread.getName();在任意位置获取线程名称
2.为线程起名:
[1]通过调用setName方法 该类对象必须是Thread得对象
[2]通过构造方法
package com.zks.demo03; public class MyRunable implements Runnable { public void run() { for (int i = 0; i <20 ; i++) { System.out.println(Thread.currentThread().getName()+"线程:"+i); } } } package com.zks.demo03; public class TestRunabel { public static void main(String[] args) { MyRunable m1=new MyRunable(); //线程任务 //线程对象 Thread t1=new Thread(m1,"线程A"); t1.start(); //线程对象 Thread t2=new Thread(m1,"线程B"); t2.start(); for (int i = 0; i <20 ; i++) { System.out.println("main线程:"+i); } } }
运行结果:
public class TicketRunable implements Runnable{ private int ticket=10; public void run() { while (ticket>0){ // System.out.println(Thread.currentThread().getName()+"买了一张剩余:"+--ticket); } } } package com.zks.demo04; public class TestTicket { public static void main(String[] args) { TicketRunable m1=new TicketRunable(); Thread t1=new Thread(m1,"窗口A"); Thread t2=new Thread(m1,"窗口B"); Thread t3=new Thread(m1,"窗口C"); Thread t4=new Thread(m1,"窗口D"); t1.start(); t2.start(); t3.start(); t4.start(); } }
测试的结果: 同一张票被多个窗口买,而且出现负票。 因为线程安全问题。
如图:
设置优先级 值1-10 值越大获取cpu得概率越大。默认为5
package com.zks.Test8; public class Priority extends Thread{ public Priority(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"线程:"+i); } } public static void main(String[] args) { Priority a = new Priority("A"); a.setPriority(10); Priority b = new Priority("B"); b.setPriority(7); Priority c = new Priority("C"); c.setPriority(1); a.start(); b.start(); c.start(); } }
运行结果
- 设置守护线程,所有前台线程结束后,守护线程也会结束。
package com.zks.Test9; public class Daemon extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "线程=====" + i); } } public static void main(String[] args) { Daemon daemon = new Daemon(); daemon.setName("守护"); daemon.setDaemon(true); Daemon daemon1 = new Daemon(); daemon1.setName("前台"); daemon.start(); daemon1.start(); for (int i = 0; i <20 ; i++) { System.out.println("主线程:"+i); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)