线程与进程
Posted 雪菇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程与进程相关的知识,希望对你有一定的参考价值。
一、线程和进程的概念
(1)进程概念
进程就是正在执行的程序,一个进程通常就是一个正在执行的应用程序。进程就是一个可执行程序一次运行的过程,它是系统进行资源分配和调度的一个独立单位。
(2)线程概念
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数(不同的线程有可能用同样的数据或方法)。
(3)进程和线程的关系
a.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个主线程,其他的线程都是由主线程去创建和启动的。
b.系统资源分配给进程,同一个进程的所有线程共享该进程的所有资源;
c.线程是指进程内的一个执行单位,也是进程内的可调度实体;
二、多线程
(1)多线程概念
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。(即同一时间执行多任务)。需要执行并发任务才需要用到多线程。
(2)多线程好处
a.Java支持编写多线程的程序;
b.多线程最大好处在于可以同时并发执行多个任务;
c.多线程可以最大限度地减低CPU的闲置时间,从而提高CPU的利用率
(3)多线程的不利方面
a.线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
b.多线程需要协调和管理,所以需要CPU时间跟踪线程;
c.线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
d.线程太多会导致控制太复杂,最终可能造成很多bug,甚至会造成死锁;
三、Java中的线程
(1)Java中的主线程
任何一个Java程序启动时,一个线程立刻运行,它执行main方法,这个线程称为线程的主线程,也就是说任何Java程序都至少有一个线程,即主线程;主线程的特殊之处在于:
a.它是产生其他线程子线程的线程;
b.通常它必须最后结束,因为执行其他子线程的关闭工作;
(2)Java创建线程的两种方法
a.继承Thread类的方式
b.实现Runnable接口的方式
(3)自定义线程----继承Thread方法
a.在Java中要实现线程,最简单的方式就是扩展Thread类,重写其中的run方法,方法原型如下:
public void run();
b.Thread类中的run方法本身并不执行任何操作,如果我们重写了run方法,当线程启动时,它将执行run方法
c.Thread类也实现了Runnable接口
继承Thread类例子:
//定义 public class MyThread extends Thread{ public void run(){ ...... } } //调用 MyThread thread = new MyThread(); thread.start();
(4)线程简单例子
a.继承Thread类的方式
package com.Thread.Demo; public class MyPrinterThread extends Thread{ public MyPrinterThread(String name) { super(name); } private int x = 0 ; public void run(){ for (int i = 0; i < 100; i++) { System.out.println(this.getName()+":"+"x="+ x); x++; } } }
package com.Thread.Demo; public class ThreadTest { public static void main(String[] args) { MyPrinterThread T1 = new MyPrinterThread("Thread1"); MyPrinterThread T2 = new MyPrinterThread("Thread2"); T1.start(); T2.start(); } }
b.实现Runnable接口的方式
package com.Thread.Demo; public class PrinterRunable implements Runnable{ private int x = 100 ; @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName()+":"+"x="+x); x--; } } }
package com.Thread.Demo; public class RunableTest { public static void main(String[] args) { PrinterRunable pr1 = new PrinterRunable(); PrinterRunable pr2 = new PrinterRunable(); Thread t1 = new Thread(pr1, "Thread1"); Thread t2 = new Thread(pr2, "Thread2"); //设置线程的优先级 t1.setPriority(1); t2.setPriority(10); t1.start(); t2.start(); } }
(5)线程常用方法
a.设置线程的优先级
Thread t = new Thread(); t.setPriority(1);
b.
以上是关于线程与进程的主要内容,如果未能解决你的问题,请参考以下文章