201871010134-周英杰《面向对象程序设计(java)》第十六周学习总结
项目 |
内容 |
《面向对象程序设计(java)》 |
https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 |
https://www.cnblogs.com/nwnu-daizh/p/12031970.html |
作业学习目标 |
(1) 掌握Java应用程序的打包操作; (2) 掌握线程概念; (3) 掌握线程创建的两种技术。 (4) 学习设计应用程序的GUI。 |
一、程序与进程的概念
程序是一段静态的代码,它是应用程序执行的蓝 本。进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。操作系统为每个进程分配一段独立的内存空间和系统资源,包括:代码数据以及堆栈等资源。每一个进程的内部数据和状态都是完全独立的。多任务操作系统中,进程切换对CPU资源消耗较大。一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多进程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
二、多线程的概念
多线程是进程执行过程中产生的多条执行线索。线程是比进程执行更小的单位。线程不能独立存在,必须存在于进程中,同一进 程的各线程间共享进程空间的数据。每个线程有它自身的产生、存在和消亡的过程, 是一个动态的概念。多线程意味着一个程序的多行语句可以看上去几 乎在同一时间内同时运行。线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程(lightweight process)。
Java实现多线程有两种途径:1)创建Thread类的子类。2)在程序中定义实现Runnable接口的类。
三、Java中的线程
在Java中,“线程”指两件不同的事情:
java.lang.Thread类的一个实例;线程的执行。
在 Java程序中,有两种方法创建线程:一是对 Thread 类进行派生并覆盖 run方法;二是通过实现Runnable接口创建。使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。一个Java应用总是从main()方法开始运行,main()方法运行在一个线程内,他被称为主线程。一旦创建一个新的线程,就产生一个新的调用栈 线程总体分两类:用户线程和守候线程。当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的。
Java线程:创建与启动
1、定义线程
扩展java.lang.Thread类。此类中有个run()方法,应该注意其用法:public void run()如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。Thread的子类应该重写该方法。
2、实现java.lang.Runnable接口。
void run()使用实现接口Runnable的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的run方法。方法run的常规协定是,它可能执行任何所需的操作。
3、实例化线程
1)如果是扩展java.lang.Thread类的线程,则直接new即可。
2)如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
[java] view plain copy
Thread(Runnabletarget)
Thread(Runnabletarget, String name)
Thread(ThreadGroupgroup, Runnable target)
Thread(ThreadGroupgroup, Runnable target, String name)
Thread(ThreadGroupgroup, Runnable target, String name, long stackSize)
其中:
Runnable target:实现了Runnable接口的类的实例。
Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。
四、线程状态
线程的状态转换是线程控制的基础。线程状态总的可以分为五大状态。用一个图来描述如下:
1、新状态:线程对象已经创建,还没有在其上调用start()方法。
2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。
5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
五、启动线程
1、在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
2、在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
3、在调用start()方法之后:发生了一系列复杂的事情
4、启动新的执行线程(具有新的调用栈);
5、该线程从新状态转移到可运行状态;
6、当该线程获得机会执行时,其目标run()方法将运行。
7、注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
六、线程的终止
1、当线程的run方法执行方法体中最后一条语句后, 或者出现了在run方法中没有捕获的异常时,线 程将终止,让出CPU使用权。
2、调用interrupt()方法也可终止线程。 void interrupt() –
1)向一个线程发送一个中断请求,同时把这个线 程的“interrupted”状态置为true。
2)若该线程处于blocked 状态, 会抛出 InterruptedException。
六、测试线程是否被中断的方法
Java提供了几个用于测试线程是否被中断的方法。
* static boolean interrupted() – 检测当前线程是否已被中断, 并重置状态 “interrupted”值为false。
* boolean isInterrupted() – 检测当前线程是否已被中断, 不改变状态 “interrupted”值 。
六、守护线程
守护线程的惟一用途是为其他线程提供服务。例 如计时线程。 若JVM的运行任务只剩下守护线程时,JVM就退 出了。在一个线程启动之前,调用setDaemon方法可 将线程转换为守护线程(daemon thread)。
第二部分、实验部分
测试程序1
程序代码如下:
package resource; import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*; /**
* @version 1.41 2015-06-12
* @author Cay Horstmann
*/
public class ResourceTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
JFrame frame = new ResourceTestFrame();
frame.setTitle("ResourceTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
} /**
* A frame that loads image and text resources.
*/
class ResourceTestFrame extends JFrame
{
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 300;//设置组件大小 public ResourceTestFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
//利用about.gif图像文件制作图标
//在找到ResourceTest类的地方查找about.gif文件
URL aboutURL = getClass().getResource("about.gif");
Image img = new ImageIcon(aboutURL).getImage();
setIconImage(img); JTextArea textArea = new JTextArea();
//读取about.txt文件
InputStream stream = getClass().getResourceAsStream("about.txt");
try (Scanner in = new Scanner(stream, "UTF-8"))
{
while (in.hasNext())
textArea.append(in.nextLine() + "\n");
}
add(textArea);
}
}
Main-Class: resource.ResourceTest
Core Java: Fundamentals
10th Edition
Cay Horstmann and Gary Cornell
Copyright 漏 2016
Prentice-Hall
运行结果如下:
测试程序2:
实验代码:
class Lefthand extends Thread {
public void run()
{
for(int i=0;i<=5;i++)
{ System.out.println("You are Students!");
try{ sleep(500); }//输出第一次后,出现休眠时间为500ms
catch(InterruptedException e)
{ System.out.println("Lefthand error.");}
} //for循环执行六次,输出6次You are Students!
}
}
class Righthand extends Thread {
public void run()
{
for(int i=0;i<=5;i++)
{ System.out.println("I am a Teacher!");
try{ sleep(300); }//输出第一次后,出现休眠时间为600ms
catch(InterruptedException e)
{ System.out.println("Righthand error.");}
}//for循环执行六次,输出6次I am a Teacher!
}
}
public class ThreadTest
{
static Lefthand left;
static Righthand right;
public static void main(String[] args)
{ left=new Lefthand();
right=new Righthand();
left.start();
right.start();
}
}
改后的程序代码:
class Lefthand implements Runnable {
public void run()
{
for(int i=0;i<=5;i++)
{ System.out.println("You are Students!");
try{ Thread.sleep(500); }
catch(InterruptedException e)
{ System.out.println("Lefthand error.");}
}
}
}
class Righthand implements Runnable {
public void run()
{
for(int i=0;i<=5;i++)
{ System.out.println("I am a Teacher!");
try{ Thread.sleep(300); }
catch(InterruptedException e)
{ System.out.println("Righthand error.");}
}
}
} public class fufj { static Thread left;
static Thread right; public static void main(String[] args)
{
Runnable rleft = new Lefthand();
Runnable rright = new Righthand();
left = new Thread(rleft);
right = new Thread(rright);
left.start();
right.start();
} }
运行结果如下:
测试程序3:
程序代码如下:
package bounce; import java.awt.geom.*; /**
* 弹球从矩形的边缘上移动和弹出的球
* @version 1.33 2007-05-17
* @author Cay Horstmann
*/
public class Ball
{
private static final int XSIZE = 15;
private static final int YSIZE = 15;
private double x = 0;
private double y = 0;
private double dx = 1;
private double dy = 1; /**
* 将球移动到下一个位置,如果球击中一个边缘,则向相反的方向移动。
*/
public void move(Rectangle2D bounds)
{
x += dx;
y += dy;
if (x < bounds.getMinX())
{
x = bounds.getMinX();
dx = -dx;
}
if (x + XSIZE >= bounds.getMaxX())
{
x = bounds.getMaxX() - XSIZE;
dx = -dx;
}
if (y < bounds.getMinY())
{
y = bounds.getMinY();
dy = -dy;
}
if (y + YSIZE >= bounds.getMaxY())
{
y = bounds.getMaxY() - YSIZE;
dy = -dy;
}
} /**
* 获取当前位置的球的形状。
*/
public Ellipse2D getShape()
{
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
}
package bounce; import java.awt.*;
import java.util.*;
import javax.swing.*; /**
* 拉球的部件。
* @version 1.34 2012-01-26
* @author Cay Horstmann
*/
public class BallComponent extends JPanel
{
private static final int DEFAULT_WIDTH = 450;
private static final int DEFAULT_HEIGHT = 350; private java.util.List<Ball> balls = new ArrayList<>(); /**
* 向组件中添加一个球。
* @param b要添加的球
*/
public void add(Ball b)
{
balls.add(b);
} public void paintComponent(Graphics g)
{
super.paintComponent(g); // 擦除背景
Graphics2D g2 = (Graphics2D) g;
for (Ball b : balls)
{
g2.fill(b.getShape());
}
} public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
}
package bounce; import java.awt.*;
import java.awt.event.*;
import javax.swing.*; /**
* 显示一个动画弹跳球。
* @version 1.34 2015-06-21
* @author Cay Horstmann
*/
public class Bounce
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
JFrame frame = new BounceFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
} /**
* 框架与球组件和按钮。
*/
class BounceFrame extends JFrame
{
private BallComponent comp;
public static final int STEPS = 1000;
public static final int DELAY = 3; /**
* 用显示弹跳球的组件构造框架,以及开始和关闭按钮
*/
public BounceFrame()
{
setTitle("Bounce");
comp = new BallComponent();
add(comp, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel();
addButton(buttonPanel, "Start", event -> addBall());
addButton(buttonPanel, "Close", event -> System.exit(0));
add(buttonPanel, BorderLayout.SOUTH);
pack();
} /**
* 向容器添加按钮。
* @param c容器
* @param title 按钮标题
* @param 监听按钮的操作监听器
*/
public void addButton(Container c, String title, ActionListener listener)
{
JButton button = new JButton(title);
c.add(button);
button.addActionListener(listener);
} /**
* 在面板上添加一个弹跳球,使其弹跳1000次。
*/
public void addBall()
{
try
{
Ball ball = new Ball();
comp.add(ball); for (int i = 1; i <= STEPS; i++)
{
ball.move(comp.getBounds());
comp.paint(comp.getGraphics());
Thread.sleep(DELAY);
}
}
catch (InterruptedException e)
{
}
}
}
运行结果如下:
package bounceThread; import java.awt.geom.*; /**
弹球从矩形的边缘上移动和弹出的球
* @version 1.33 2007-05-17
* @author Cay Horstmann
*/
public class Ball
{
private static final int XSIZE = 15;
private static final int YSIZE = 15;
private double x = 0;
private double y = 0;
private double dx = 1;
private double dy = 1; /**
将球移动到下一个位置,如果球击中一个边缘,则向相反的方向移动。
*/
public void move(Rectangle2D bounds)
{
x += dx;
y += dy;
if (x < bounds.getMinX())
{
x = bounds.getMinX();
dx = -dx;
}
if (x + XSIZE >= bounds.getMaxX())
{
x = bounds.getMaxX() - XSIZE;
dx = -dx;
}
if (y < bounds.getMinY())
{
y = bounds.getMinY();
dy = -dy;
}
if (y + YSIZE >= bounds.getMaxY())
{
y = bounds.getMaxY() - YSIZE;
dy = -dy;
}
} /**
获取当前位置的球的形状。
*/
public Ellipse2D getShape()
{
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
}
package bounceThread; import java.awt.*;
import java.util.*;
import javax.swing.*; /**
* 拉球的部件。
* @version 1.34 2012-01-26
* @author Cay Horstmann
*/
public class BallComponent extends JComponent
{
private static final int DEFAULT_WIDTH = 450;
private static final int DEFAULT_HEIGHT = 350; private java.util.List<Ball> balls = new ArrayList<>(); /**
* 在面板上添加一个球。
* @param b要添加的球
*/
public void add(Ball b)
{
balls.add(b);
} public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
for (Ball b : balls)
{
g2.fill(b.getShape());
}
} public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
}
运行结果如下:
实验2:结对编程练习:采用GUI界面设计以下程序,并创建程序归档文件。
设计一个100以内整数小学生四则运算练习程序,由计算机随机产生10道加减乘除练习题,学生输入答案,由程序检查答案是否正确,每道题正确计10分,错误不计分,10道题测试结束后给出测试总分;
将程序中测试练习题及学生答题结果输出到文件,文件名为test.txt。
import java.awt.*;
import javax.swing.*; public class DemoTest {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new Demo();
frame.setTitle("计算题");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import javax.swing.*; public class Demo extends JFrame {
int i = 0;
int i1 = 0;
int k = 0;
int sum = 0;
private PrintWriter out = null;
private String[] c1 = new String[10];
private String[] c2 = new String[10]; public Demo() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 3));
JTextArea jt1 = new JTextArea();
JTextField jt2 = new JTextField();
JTextArea jt3 = new JTextArea();
panel.add(jt1);
panel.add(jt2);
panel.add(jt3);
add(panel, BorderLayout.NORTH); JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(1, 2));
Button button1 = new Button("生成题目"); Button button2 = new Button("生成文件");
panel1.add(button1);
panel1.add(button2); add(panel1, BorderLayout.SOUTH);
setSize(600, 300);
button1.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
jt2.setText(null);
jt3.setText(null);
if (i < 10) {
int a = (int) (Math.random() * 100);
int b = (int) (Math.random() * 100);
int m = (int) Math.round(Math.random() * 3);
switch (m) {
case 0:
while (b == 0 || a % b != 0) {
b = (int) Math.round(Math.random() * 100);
a = (int) Math.round(Math.random() * 100);
}
jt1.setText(i + 1 + ": " + a + "/" + b + "=");
c1[i] = (jt1.getText());
k = a / b;
i++;
break;
case 1:
jt1.setText(i + 1 + ": " + a + "*" + b + "=");
c1[i] = (jt1.getText());
k = a * b;
i++;
break;
case 2:
jt1.setText(i + 1 + ": " + a + "+" + b + "=");
c1[i] = (jt1.getText());
k = a + b;
i++;
break;
case 3:
while (a < b) {
b = (int) Math.round(Math.random() * 100);
a = (int) Math.round(Math.random() * 100);
}
jt1.setText(i + 1 + ": " + a + "-" + b + "=");
c1[i] = (jt1.getText());
k = a - b;
i++;
break;
}
}
}
});
jt2.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
if (i < 11) {
int find = Integer.parseInt(jt2.getText());
String d = jt2.getText().toString().trim();
int a = Integer.parseInt(d);
if (jt2.getText() != "") {
if (find == k) {
sum += 10;
jt3.setText("答案正确");
} else jt3.setText("答案错误");
}
c2[i1] = d;
i1++;
}
}
});
button2.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
try {
out = new PrintWriter("text.txt");
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for (int counter = 0; counter < 10; counter++) {
out.println(c1[counter] + c2[counter]);
}
out.println("成绩" + sum);
out.close();
}
});
}
}
运行结果:
结对过程描述及结对照片:
实验总结:
通过本周的学习,我掌握Java应用程序的打包操作; 掌握线程概念; 掌握线程创建的两种技术。 学习设计应用程序的GUI。结对时感觉把以前的忘掉了,真的烦,不过我还是会更加了努力的。
201871010134-周英杰《面向对象程序设计(java)》第十六周学习总结的更多相关文章
- 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结
<面向对象程序设计Java>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...
- 201771010118马昕璐《面向对象程序设计java》第八周学习总结
第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...
- 201771010134杨其菊《面向对象程序设计java》第八周学习总结
第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类: Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...
- 201771010134杨其菊《面向对象程序设计java》第七周学习总结
第七周学习总结 第一部分:理论知识 1.继承是面向对象程序设计(Object Oriented Programming-OOP)中软件重用的关键技术.继承机制使用已经定义的类作为基础建立新的类定义,新 ...
- 201771010128 王玉兰《面象对象程序设计 (Java) 》第六周学习总结
---恢复内容开始--- 第一部分:基础知识总结: 1.继承 A:用已有类来构建新类的一种机制,当定义了一个新类继承一个类时,这个新类就继承了这个类的方法和域以适应新的情况: B:特点:具有层次结构. ...
- 201771010123汪慧和《面向对象程序设计JAVA》第六周实验总结
一.理论部分: 1.继承 用已有类来构建新类的一种机制.当定义了一个新类继承了一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的情况. 2.类.超类.子类 (1)类继承 ...
- 201871010126 王亚涛《面向对象程序设计 JAVA》 第十三周学习总结
内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...
- 201777010217-金云馨《面向对象程序设计Java》第八周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201871010126 王亚涛 《面向对象程序设计 (Java)》第十七周学习总结
内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/12 ...
- 马凯军201771010116《面向对象程序设计Java》第八周学习总结
一,理论知识学习部分 6.1.1 接口概念 两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构:二,一个类所具有的方法的特征集合,是一种逻辑上的抽象.前者叫做“Java接口”,后 ...
随机推荐
- RabbitMQ的消息传输保障三个层级
这里只简单介绍一下三个层级,笔记摘录自<RabbitMQ实战指南>朱忠华作者 消息可靠传输一般是业务系统接入消息中间件时候首要考虑的问题,一般消息中间件的消息传输保障分为三个层级 1 A ...
- Python进阶-XVII 非python的接口类、多态、python自己的封装
1.python模拟java中的接口类 python中是没有接口类的概念的,因为它支持多继承,但是java不能,所以就提出一个接口类的概念 java : 面向对象编程 设计模式 —— 接口 接口类 : ...
- Vue中MVVM模式的双向绑定原理 和 代码的实现
今天带大家简单的实现MVVM模式,Object.defineProperty代理(proxy)数据 MVVM的实现方式: 模板编译(Compile) 数据劫持(Observer) Object ...
- 第04组 Alpha冲刺(5/6)
队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 才两天,也就是实现一些功能而已 复习了一下SuffixAutomata 接下来的计划 实现 ...
- 诡异问题:tomcat启动一直卡住,strace跟踪提示apache-tomcat核心文件找不到。
最近遇到了一个诡异的tomcat问题,被这个问题折磨了2天.是这样的,启动tomcat后一直卡在这个点上: org.apache.catalina.core.StandardEngine.startI ...
- python 学习常见问题笔记
1.for...if...构建List segs = [v for v in segs if not str(v).isdigit()]#去数字 https://www.cnblogs.com/eni ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 【shell脚本】将三个数字进行升序排序===numSort.sh
从命令输入三个数字进行升序排序(冒泡排序) 原理:比较两个相邻的元素,将值大的元素交换至右端. 脚本内容: [root@VM_0_10_centos shellScript]# cat numSort ...
- Tensorflow faster rcnn系列一
注意:本文主要是学习用,发现了一个在faster rcnn训练流程写的比较详细的博客. 大部分内容来自以下博客连接:https://blog.csdn.net/weixin_37203756/arti ...
- Java使用路径通配符加载Resource与profiles配置使用
序言 Spring提供了一种强大的Ant模式通配符匹配,能从一个路径匹配一批资源. Ant路径通配符 Ant路径通配符支持“?”.“*”.“**”,注意通配符匹配不包括目录分隔符“/”: “?”:匹配 ...