• 线程与进程


    一、线程和进程的概念

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

  • 相关阅读:
    Ubuntu下speedtest的安装
    Ubuntu下快速安装LAMP server
    用python3.3爬取图片
    用python3.3结合snmpget截取信息
    开源数据库Postgresql的备份和恢复
    vuedraggable 两个不同结构的数组之间拖拽
    MyBatis 使用另一个 mapper 中的 resultMap 和 sql
    怎样处理从后台传来大量数据的分页操作
    doc命令操纵数据库
    (全)Mac中mysql的root账户初始密码忘记解决办法以及更改
  • 原文地址:https://www.cnblogs.com/xuegu/p/7407413.html
Copyright © 2020-2023  润新知