JAVA——多线程Thread

进程

是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程:

就是进程中的一个独立的控制单元。线程在控制着进程的执行。

一个进程中至少有一个线程。

Java VM启动的时候会有一个进程java.exe

该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称为主线程。

扩展:

其实更细节说明JVM,JVM启动不止一个线程,还有负责

垃圾回收的线程。

1、如何在自定义的代码中,自定义一个线程呢?

通过对API的查找,JAVA已经提供了对线程这类事物的描述。就Thread类。

创建线程的第一种方式:继承Thread类.

步骤:

1>定义类继承Thread.

2>复写Thread类中的run方法

目的:将自定义的代码存储在run方法中。让线程运行。

3>调用线程的start方法,该方法两个作用:启动线程,调用run方法。

class Demo extends Thread
{
    public void run()
    {
        for(int x= 0;x<10;x++)
        System.out.println("demo run");
    }
}

class ThreadDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();//创建好一个线程,并没执行
        d.start();

        for(int x =0;x<10;x++)
            System.out.println("Hello World!---"+x);

    }
}

发现运行结果每次都不同。因为多个线程获取CPU的执行权,cpu执行到谁,谁就运行。

明确一点,在某一时刻,只能有一个程序在运行。(多核除外)

cpu在做着快速的切换,以达到看上去是同时运行的效果。

我们可以形象把多线程的运行行为看成是互相抢夺cpu的执行权。

这就是多线程的一个特性:随机性,谁抢到谁执行,至于执行多长时间,cpu说的算。

假如说我们不调用start方法,而是直接调用run方法:

class Demo extends Thread
{
    public void run()
    {
        for(int x= 0;x<10;x++)
        System.out.println("demo run");
    }
}

class ThreadDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();//创建好一个线程,并没执行
        //d.start();
        d.run();

        for(int x =0;x<10;x++)
            System.out.println("Hello World!---"+x);

    }
}

结果无论运行多少次都是一样的。为什么呢?因为没有调用start,线程虽然创建了,可是线程根本就没有开启,就相当于在主线程中执行的,也就是和普通的方法调用没有区别。

线程运行的状态

线程有自己默认的名称:

Thread-编号 该编号从0开始

static Thread currentThread():获取当前线程对象

getName():获取线程名称

设置线程名称:setName或者构造函数

例子:简单的卖票程序,多个窗口同时卖票

class Ticket extends Thread
{
    private int ticket = 20;
    public void run()
    {
        while(true)
        {
            if(ticket>0)
            {
                System.out.println(Thread.currentThread().getName()+"---sale :"+ticket--);
            }
        }
    }
}
class TicketDemo
{
    public static void main(String[] args)
    {
        Ticket t1  = new Ticket();
        Ticket t2  = new Ticket();
        Ticket t3  = new Ticket();
        Ticket t4  = new Ticket();

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}

我们发现其实创建了四个线程,每个线程都有20张票。所以怎么才能让这四个线程共享这20张票呢?

有人肯定会想设置为静态变量不就行了吗?我们看看:

确实可以啊,不过我们不提倡使用静态变量。因为占用时间太长。那到底还有没有别的方法呢?有人想,这不简单吗?让一个线程执行多次不就行了吗?

class TicketDemo
{
    public static void main(String[] args)
    {
        Ticket t1  = new Ticket();
        t1.start();
        t1.start();
        t1.start();
        t1.start();

    }
}

一个线程开启了,再开启几次有用吗??没用的。那具体怎么解决呢?那就引出来了Runnable接口。

请见下篇。

时间: 2024-08-04 10:54:43

JAVA——多线程Thread的相关文章

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

Java多线程——Thread的native底层实现

Java多线程 当我们去阅读java的Thread类的时候,会发现这个类与大部分的java类库API有着明显的差别,它的所有关键方法都被声明为native. native本身指代的就是本地方法,而又由于java线程模型采用基于操作系统原生线程模型,这里默认Thread中native方式代指的是Native POSIX Thread Library. 线程的实现方式有三种:分别是内核线程实现(1:1实现),使用用户线程实现(1:N),使用用户线程加轻量级进程混合实现(N:M实现).而Java从1.

java 多线程--- Thread Runnable Executors

java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long minPrime; primeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime } } PrimeThread p = new

[java多线程] - Thread&amp;Runnable运用

负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能出现低效率的问题.多线程就是一种提高服务效率的方式.面对海量的用户请求,单线程肯定扛不住,那么多线程的需求也就应运而生,所以说掌握多线程的开发技术对于技术人员来说肯定是非常重要的.参考文档http://docs.oracle.com/javase/7/docs/api/. 一.Runnable使用

Java 多线程——Thread类和Runable接口

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: [java] view plaincopy package org.thread.demo; class MyThread extends Thread{ private String name; public

JAVA多线程Thread VS Runnable详解

要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件 进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立.所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位.线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源.所以线程是轻量级的

Java 多线程(Thread) 同步(synchronized) 以及 wait, notify 相关 [实例介绍]

场景描述 有一家很大的商场,在某市有几个商品配送中心,并有几家分店,这家商场经营很多的商品,平时运营情况是这样的: 根据各分店的商品销售情况,给分店配送相应需求量的商品:并上架到分店指让的位置,供客户选购. 客户选择自己需要的商品,然后到收银台交钱打包; 然后到一天的某个时候分店管理员(经理等),开始统计当前的销售情况,并计划向商品配送中心订购各商品的配送量: 场景模拟 1. 商场类; public class StoreMart { //商场这一天剩余的商品量 private static M

java多线程(thread/runnable)

1 class Thread1 extends Thread Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); 2 class Thread2 implements Runnable new Thread(new Thread2("C")).start(); new Thread(new Thread2("D

Java多线程Thread使用匿名内部类创建的两种方式

匿名内部类实现线程的两种方式: 第一种方式: 1.继承Thread类 2.重写run方法 3.将要执行的代码写在run方法中 第二种方式: 1.将Runnable的子类对象传递给Thread的构造方法 2.重写run方法 3.将执行的代码写在run方法中,最后我们开启线程 package com.yyx.thread; /** * 匿名内部类创建线程 yyx 2018年2月4日 */ public class AnonymousThread { public static void main(S