JAVA学习线路:day09多线程[1]

JAVA多线程详解(超详细) 程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和指令集,是一个静态的概念。进程(Process):将程序运行起来,我们称之为进程。进程是执行程序的一次执行过程,它是动态的概念。进程存在生命周期,也就是说程序随着程序的终止而销毁。进程之间是通过TCP/IP端口实现交互的。线程(Thread):线程是进程中的实际运作的单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程。线程是CPU调度和执行的最小单位。注意。 阅读详情

心得:
我是一名正在自学的java的即将毕业的大学生
总结笔记是为了让自己更好的理解和加深印象。可能不是那么美观,自己可以看懂就好
所有的文档和源代码都开源在GitHub: https://github.com/kun213/DailyCode上了。希望我们可以一起加油,一起学习,一起交流。

day09【多线程】

一、多线程和进程的概念

1、说出进程的概念

**进程:**是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。

2、说出线程的概念

线程:是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

进程与线程的区别
  • 进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
  • 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。

**注意:**下面内容为了解知识点

  1. 因为一个进程中的多个线程是并发运行的,那么从微观角度看也是有先后顺序的,哪个线程执行完全取决于 CPU 的调度,程序员是干涉不了的。而这也就造成的多线程的随机性。
  2. Java 程序的进程里面至少包含两个线程,主进程也就是 main()方法线程,另外一个是垃圾回收机制线程。每当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就是在操作系统中启动了一个线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启动两个线程。
  3. 由于创建一个线程的开销比创建一个进程的开销小的多,那么我们在开发多任务运行的时候,通常考虑创建多线程,而不是创建多进程。

二、多线程的创建-继承方式

1、能够使用继承类的方式创建多线程

Java中通过继承Thread类来创建并启动多线程的步骤如下:

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
  2. 创建Thread子类的实例,即创建了线程对象
  3. 调用线程对象的start()方法来启动该线程

自定义线程类:

public class MyThread extends Thread {
	/**
	 * 重写run方法,完成该线程执行的逻辑
	 */
	@Override
	public void run() {
		for (int i = 0; i < 200; i++) {
			System.out.println("自定义线程正在执行!"+i);
		}
	}
}

测试类:

/**
 *  线程: 也是对象
 *  java.lang.Thread类,描述了线程对象
 *  实现多线程程序的方式一:
 *    1: 定义类继承Thread
 *    2: 重写方法run
 *    3: 创建子类对象
 *    4: 子类对象调用方法 start()
 *      线程执行,JVM调用run()
 */
public static void main(String[] args) {
    //创建自定义线程对象
    MyThread mt = new MyThread();
    //开启新线程
    mt.start();
    //在主方法中执行for循环
    for (int i = 0; i < 200; i++) {
    	System.out.println("main线程!"+i);
    }
}
2、问题
/**
 *   1: 为什么要继承Thread  (一切是对象)
 *     Thread是线程对象,继承Thread,子类也是线程对象
 *
 *   2: 为什么重写run
 *     每个程序人员,用线程运行什么程序,未知的
 *     线程做秒杀,线程游戏,测试
 *     线程建对象,线程做循环
 *     规定模版,run()方法,无论用线程做什么,代码写run中
 *     JVM就调run
 *
 *   3: 启动线程为什么调用start,而不是run
 *     线程中: 被CPU执行,Java技术实现线程依赖本机操作系统
 *     要和操作系统交互了
 *     start()方法,内部调用另一个方法 start0()
 *     private native void start0(); 操作系统交互,启动线程
 */
3、能够获取线程的名称
  • Thread类的方法String getName()可以获取到线程的名字。

  • Thread类的方法setName(String name)设置线程的名字。

  • 通过Thread类的构造方法Thread(String name)也可以设置线程的名字。

public class MyThread extends Thread {
    public void run(){
        System.out.println("线程名字:"+super.getName());//父类调用父类方法
        System.out.println( "---------------------");
        Thread t = Thread.currentThread();//当前线程,就是Thread-0
        System.out.println( "线程名字::"+t.getName());
    }
}

测试类:

/**
 * 获取线程的名字
 *
 * 每个线程都有名字,
 * 默认的是Thread-0,Thread-1
 * Thread类有方法
 *   String getName()获取线程名
 *
 *  Thread类静态方法
 *    static Thread currentThread() 返回正在执行的线程对象,当前线程对象
 *    方法写在哪里,哪里就是当前线程
 */
public class ThreadDemo {
    public static void main(String[] args) {
        MyThread my = new MyThread();
        my.start();

        Thread t = Thread.currentThread();//当前正在执行的线程,主线程
        System.out.println(t.getName());

    }

注意:线程是有默认名字的,如果我们不设置线程的名字,JVM会赋予线程默认名字Thread-0,Thread-1。一般情况我们都会用默认名称。

三、线程的创建-实现方式

1、能够使用实现接口的方式创建多线程

采用java.lang.Runnable也是非常常见的一种,我们只需要重写run方法即可。

步骤如下:

  1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
  3. 调用线程对象的start()方法来启动线程。
public class MyRunnable implements Runnable{
	public void run() {
		for (int i = 0; i < 20; i++) {
			System.out.println("线程名称:"+Thread.currentThread().getName()+" "+i);
		}
	}
}

测试类

/**

 * 实现多线程的第二种方式: 接口实现
 * 1: 定义类实现接口 java.lang.Runnable
 * 2: 重写方法run
 * 3: 创建Thread对象
 * Thread(Runnable target) 传递接口实现类对象
 * 4: Thread类方法start()启动线程
   */
   public class ThreadDemo {
   public static void main(String[] args) {
       //创建Runnable接口实现类对象
     MyRunnable my = new MyRunnable();
       //创建Thread对象,构造方法中传递接口实现类对象
       Thread t = new Thread(my);
       t.start();
   }
   }

通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个执行目标。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。

在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。

实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是继承Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。

2、能够说出实现接口方式的好处(Thread和Runnable的区别)

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

实现Runnable接口比继承Thread类所具有的优势:

  1. 适合多个相同的程序代码的线程去共享同一个资源。
  2. 可以避免java中的单继承的局限性。
  3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。

四、线程安全

演示线程的安全问题:

电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃大战奥特曼”,本次电影的座位共100个(本场电影只能卖100张票)。

我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票)

需要窗口,采用线程对象来模拟;需要票,Runnable接口子类来模拟

模拟票

public class Ticket implements Runnable {
    //定义票源
    private int tickets = 100;
    private Object object = new Object();
    //在方法run()售票
    /**
     *  通过程序添加线程的休眠方法 10毫秒
     *  出现了数据的安全问题
     *
     *  同步技术保证线程安全
     *  关键字 : synchronized
     *  语法:
     *    synchronized(任意对象){
     *        线程操作的所有共享数据
     *    }
     *    同步代码块
     *    锁: 有锁的线程进入同步代码块执行,执行完毕归还锁
     *    无锁的线程,等待在同步之外
     */
    public void run(){
        while(true) {
           // synchronized (object) {
                if (tickets > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("线程名称:" + Thread.currentThread().getName() + "出售第" + tickets--);
                }
            //}
        }
    }

测试类

/**
 * 售票案例,引出线程的安全问题
 * 前提: 必须是多个线程,同时操作一个资源
 *
 * 电影票只有100张 (资源)
 * 3个售票窗口,同时出售 (资源共享,100张)
 */
public class ThreadDemo {
    public static void main(String[] args) {
        //创建Runnable接口实现类对
        Ticket t = new Ticket();
        //创建线程对象,3个
        Thread th1 = new Thread(t);
        Thread th2 = new Thread(t);
        Thread th3 = new Thread(t);

         th1.start();
         th2.start();
         th3.start();
    }

结果中有一部分这样现象

发现程序出现了两个问题:

  1. 相同的票数,比如5这张票被卖了两回。
  2. 不存在的票,比如0票与-1票,是不存在的。

这种问题,几个窗口(线程)票数不同步了,这种问题称为线程不安全。

1、能够解释安全问题的出现的原因

线程安全问题引发:线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

2、能够使用同步代码块解决线程安全问题

同步代码块:线程操作的共享数据进行同步。synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

格式:

synchronized(同步锁){
     需要同步操作的代码
}

同步锁:

同步锁又称为对象监视器。同步锁只是一个概念,可以想象为在对象上标记了一个锁.

  1. 锁对象 可以是任意类型。
  2. 多个线程对象 要使用同一把锁。

注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着(BLOCKED)。

使用同步代码块解决代码:

public class Ticket implements Runnable{
	private int ticket = 100;
	private Object lock = new Object();
	/*
	 * 执行卖票操作
	 */
	@Override
	public void run() {
		//每个窗口卖票的操作 
		//窗口 永远开启 
		while(true){
			synchronized (lock) {
				if(ticket>0){//有票 可以卖
					//出票操作
					//使用sleep模拟一下出票时间 
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					//获取当前线程对象的名字 
					String name = Thread.currentThread().getName();
					System.out.println(name+"正在卖:"+ticket--);
				}
			}
		}
	}
}

注意:线程运行至同步代码块的时候,需要判断锁,获取锁,出去同步代码块后要释放锁,增加了很多操作,因此线程安全,程序的运行速度慢!

3、能够使用同步方法解决线程安全问题

同步方法:当一个方法中的所有代码,全部是线程操作的共享数据的时候,可以将整个方法进行同步。使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。

格式:

public synchronized void method(){
   	可能会产生线程安全问题的代码
}

使用同步方法代码如下:

public class Ticket implements Runnable{
	private int ticket = 100;
	/*
	 * 执行卖票操作
	 */
	@Override
	public void run() {
		//每个窗口卖票的操作 
		//窗口 永远开启 
		while(true){
			sellTicket();
		}
	}
	
	/*
	 * 锁对象 是 谁调用这个方法 就是谁 
	 *   隐含 锁对象 就是  this
	 *    
	 */
	public synchronized void sellTicket(){
        if(ticket>0){//有票 可以卖	
            //出票操作
            //使用sleep模拟一下出票时间 
            try {
              	Thread.sleep(100);
            } catch (InterruptedException e) {
              	e.printStackTrace();
            }
            //获取当前线程对象的名字 
            String name = Thread.currentThread().getName();
            System.out.println(name+"正在卖:"+ticket--);
        }
	}
}

同步锁是谁?

​ 对于非static方法,同步锁就是this。

​ 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

五、线程状态

1、能够说出线程6个状态的名称

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State这个枚举中给出了六种线程状态:

这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析。

线程状态导致状态发生条件
NEW(新建)线程刚被创建,但是并未启动。还没调用start方法。
Runnable(可运行)线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。
Blocked(锁阻塞)当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。
Waiting(无限等待)一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
Timed Waiting(计时等待)同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。
Teminated(被终止)因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
2、线程状态图

我们不需要去研究这几种状态的实现原理,我们只需知道在做线程操作中存在这样的状态。那我们怎么去理解这几个状态呢,新建与被终止还是很容易理解的,我们就研究一下线程从Runnable(可运行)状态与非运行状态之间的转换问题。


这是我的公众号,希望大家可以关注,让我们一起做最好的自我。
我也会把我自学视频分享在上面,供大家一起学习。

CodeBull

2019最新《传智教育黑马java项目实战》 1.SE基础班1-1 Java基础语法1-2 面向对象和封装1-3 常用API第一部分1-4 继承与多态1-5 常用API第二部分1-6 集合1-7 异常与多线程1-8 File类与IO流1-9 网络编程1-10 JDK8新特性阶段1视频目录.docx2.javaweb2-1基础加强.zip2-2MySQL.zip2-3JDBC.zip2-4HTML和CSS.zip2-5JavaScript.zi... 阅读详情

相关推荐

从Jira到Notion:用Sequential Thinking重构你的敏捷工作流(含GPT-6配置模板)

本文探讨了如何利用Sequential Thinking这一AI认知模型,重构敏捷开发工作流。通过连接Jira、Notion等工具,构建动态依赖图谱,实现从被动响应到主动规划的转变。文章提供了详细的配置教程和GPT-6配置模板,帮助团队实现任务自动拆解、智能看板生成与跨平台协调,从而提升项目管理效率。

gpt4scribbler的博客 204

java多线程(超详细)

进程就是正在运行中的程序(进程是驻留在内存中的)是系统执行资源分配和调度的独立单位每一进程都有属于自己的存储空间和系统资源注意:进程A和进程B的内存独立不共享。

zdl66的博客 10万+

ArcGIS基础:点要素分割线要素和提取线要素的交点

第一个实验:【点要素分割线要素】看下原始数据:下图所示,2个红点和一条绿线,用2个点去分割这条线。 找到【数据管理工具】,在找到【要素】,再找到【在点处分割线】,如下图所示。 输入线、点要素,然后在【搜索半径】里输入5米,查看一下结果。 查看结果发现,线段被分割了2段,我们查看一下原因。 发现第2个点与线有一段距离,肯定是大于5米的,所以分割没有成功。可以量测一下距离,重新输入搜索半径。 我们把搜索半径改为200米,勘察结果,被点分割了3段。 接下来使用另外一个工具【在折点处分割线】,如下所示。

yuanYW7556的博客 1万+

Java多线程技术详解(全都是细节!)

详解Java多线程的多线程启动,线程标识,线程状态,sleep()与yield()方法,线程优先级,守护线程,全是细节!详解多线程中常出现的异常等!

qq_51070724的博客 768

如何在高版本的ubuntu系统里安装gcc4.1.2

1、下载安装包,一共五个http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-4.1/,根据计算机系统位数   进行下载,64位下载amd64结尾的。开头分别是cpp-4.1_4.1.2、g++-4.1_4.1.2、gcc-4.1-base_4.1.2、gcc-     4.1_4.1.2、libstdc++6-4.1 2、使用sudo d

lsr_fighting的博客 1931

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

Yilu264的博客 1万+

JAVA多线程(超详细)

Thread类提供是了大量的方法来控制和操作过程。Thread类的常用方法如下表所示。Thread类的静态方法currentThread()返回当前线程对象的引用。在java程序启动时,一个线程立即随之启动,这个线程通常被称为程序的主线程。public static void main()方法是主线程的入口,每个进程至少有一个主线程。它的重要性如下。主线程是产生其他子线程的线程。主线程通常必须最后完成运行,因为它执行各种关闭动作。尽管主线程是自动创建的,但是可以由一个Thread对象控制。

wu_ry的博客 2869

TIBCO Jaspersoft Studio报表开发 使用教程-进阶版

本文学习内容容器定制二级目录三级目录 容器定制 二级目录 三级目录

吉哲的博客 7520

一篇搞懂Java多线程(全网最细)

Java多线程是一种强大而有趣的编程概念。它允许程序同时执行多个任务,就像一个宏大的交响乐团。每个线程都是一个独立的执行路径,有自己的速度和优先级。那么,我们期待多线程能给我们带来什么呢?

让优秀成为一种习惯! 1万+

JavaScript实现边缘检测Canny(附完整源码)

JavaScript实现边缘检测Canny(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 705

真格量化——GFTD策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import numpy as np import math #开始时间,用于初始化一些参数 def OnStart(context) : print "I\'m starting..." #设置全局变量 g.signalcount = 0 g.signal_list = [] g.buysignal = 0 .

qq_26742269的博客 1284

最新Java基础系列课程--Day14-多线程编程

多线程(Multithread)是指在同一个程序中同时存在几个执行体,按几条不同的执行路径共同工作的情况

znzbs的博客 7890

【Proteus仿真】点亮小灯系列仿真——小灯闪烁/流水灯/交通灯

本文介绍了基于AT89C51单片机的LED控制案例,共包含5个实例:1)单个LED闪烁;2)共阳极流水灯;3)共阴极流水灯;4)花样流水灯;5)交通灯模拟。每个案例详细说明了电路原理图、接线方式和控制程序实现,其中重点讲解了PWM调光原理及其在LED控制中的应用。案例由简至繁,从基础I/O控制到复杂花样显示,最后实现交通灯逻辑控制,展示了单片机在LED控制中的典型应用方法。文中提供了完整的源代码,便于读者理解和实践。

XU157303764的博客 1882

汇总:java基础复习路线

Day01基础1-- 计算机、java语言、 java开发工具安装

weixin_58580280的博客 455

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】

1.1、网络编程概述 1.2、网络编程三要素 1.3、IP地址 1.4、InetAddress的使用 1.5、端口 1.6、协议 2.1、UDP通信原理 2.2、UDP发送数据 2.3、UDP接收数据 2.4、UDP通信程序练习 3.1、TCP通信原理 3.2、TCP发送数据 3.3、TCP接收数据 3.4、TCP通信程序练习

upward 1182

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

javaday-26网络编程

26.09_网络编程(网络编程概述)(了解) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 B:网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。 26.10_网络编程(网络编程三要素之IP概述)(掌握) 每个设备在网络中的唯一

First 007的博客 472

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Java 基础篇】Java多线程编程详解

本文详细介绍了Java多线程编程的概念、原理和常用技术。多线程编程可以提高程序的性能和响应能力,但也需要注意线程安全和线程同步的问题。在实际开发中,合理地使用多线程可以充分发挥多核处理器的优势,提高程序的并发能力和执行效率。同时,需要注意避免多线程之间的竞争条件和数据一致性问题,保证线程的安全性和正确性。希望本文对你理解和应用Java多线程编程有所帮助!

繁依Fanyi的博客 3110

JAVA多线程

/线程的三种启动方式 public static void main(String [ ] args) {//1.方式1 继承Thread启动线程 Mythread mythread = new Mythread();//2.方式2 实现 Runable接口启动 Mytask mytask = new Mytask();//3.方式3 匿名内部类启动 与方式2本质上相同只是简洁写法 但是可读性差 new Thread(new Runnable() {i < 10;i ++) {

weixin_45812603的博客 453

Java 多线程超详细整理,从入门到精通

进程是程序在数据集合上的一次运行活动,操作系统资源分配最小单位,简单理解:电脑中运行的软件程序。独立性:每个进程拥有独立内存空间,无法直接访问其他进程数据;动态性:进程动态创建、运行、销毁;并发性:多个进程可同时交替运行。线程是进程内部独立子任务,进程内调度执行最小单位,一个进程至少包含 1 个主线程,多个线程共享进程资源。充分利用 CPU 多核,提升程序执行效率;同一程序可同时处理多个独立任务(如下载 + 浏览)。频繁创建、销毁线程消耗大量操作系统资源,大量短时线程容易内存溢出。

mgw1413的博客 212

Java多线程(可能是全网最详细)

程序是指令和数据的集合,其本身没有任何运行的含义,是一个静态的概念。线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径。一个进程中包含一个顺序控制流(一条执行路径)一个进程中包含多个顺序控制流(多条执行路径)Thread 类是 JVM 用来管理线程的一个类,用Thread 类的对象就是来描述一个线程执行流,JVM 会将这些 Thread 对象组织起来,用于线程调度,线程管理。

qq_45559559的博客 4484

Java游戏——贪吃蛇(代码逐行注释),新手小白收藏这篇就够了

这个程序实现了一个简单的贪吃蛇游戏,并提供了详细的注释帮助理解每一部分代码的功能。您可以将这段代码保存到一个名为的文件中,并使用Java编译器编译运行它。有些朋友可能觉得说希望贪吃蛇可以自由穿梭边界,也不是不行,只需要改其中的代码就行如果您希望贪吃蛇可以自由穿梭边界,即当蛇移动到游戏区域的边界时,从相反的边界重新出现,您可以修改move()方法来实现这一功能。以下是修改后的move()方法:i > 0;

Libra1313的博客 1663

java多线程的四种创建方式、程序、线程、进程、并行、串行、Thread、Runnable、Callable、线程池技术

单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。(现在的服务器都是多核的)一个Java应用程序java.exe,其实至少有三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。Java的JVM允许程序运行多个线程,使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或子类的实例。现代的操作系统,大都是支持多进程的,支持同时运行多个程序。程序是静态的,进程是动态的 如:运行中的QQ,运行中的MP3播放器。提高应用程序的响应。

LIJINGPO的博客 937

JAVA 多线程

创建状态,阻塞状态,死亡装填,就绪状态运行状态} } // 1. 继承Thread类 class MyThread1 extends Thread {} } // 2. 实现Runnable接口 class MyThread2 implements Runnable {} } // 3. 实现Callable接口 class MyThread3 implements Callable < Integer > {return 100;} }

m0_72527474的博客 329
上一篇: JAVA学习线路:day08集合[3]
下一篇: JAVA学习线路:day10多线程[2]
CodeBull码牛
博客等级 码龄6年 14粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值