线程与进程

一、线程和进程的概念

(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.

原文地址:https://www.cnblogs.com/xuegu/p/7407413.html