会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132384个问题

照著老師的代码敲的找不到为什么会报这个错误


image.png

package com.bjsxt;

public class MySinglyLinkedList<E> implements MyList<E> {
    class Node<E>{
        private E item;
        private Node next;
        Node(E item, Node next){
            this.item =item;
            this.next = next;
        }
    }
    private Node head;
    private int size;
    @Override
    public void add(E element) {
        Node<E> node = new Node<>(element,null);
        Node tail = getTail();
        if (tail == null){
            this.head = node;
        }else{
            tail.next = node;
        }
        this.size++;


    }
    private Node getTail(){
        if(this.head == null){
            return null;
        }
        Node node = this.head;
        while (true){
            if(node.next == null)break;
            node = node.next;

        }
        return node;
    }

    @Override
    public E get(int index) {
        this.checkIndex(index);
        Node<E> node = this.getNode(index);
        return node.item;
    }

    private void checkIndex(int index){
        if(!(index >= 0 && index < this.size)){
            throw new IndexOutOfBoundsException("Index:"+index+"Size:"+this.size);
        }
    }
    private Node getNode(int index){
        Node<E> node = this.head;
        for (int i=0;i<index;i++){
            node = node.next;
        }
        return node;
    }

    @Override
    public E remove(int index) {
        this.checkIndex(index);
        Node<E> node = this.getNode(index);
        E item = node.item;
        if(this.head == node){
            this.head = node.next;
        }else{
            Node<E> temp =this.head;
            for(int i=0;i<index-1;i++){
                temp = temp.next;
            }
            temp.next = node.next;
        }
        node.next = null;
        this.size--;
        return item;
    }

    @Override
    public int size() {
        return this.size;
    }

    public static void main(String[] args) {
        MySinglyLinkedList<String> mySinglyLinkedList = new MySinglyLinkedList<>();
        MySinglyLinkedList.add("a");
        MySinglyLinkedList.add("b");
        MySinglyLinkedList.add("c");
        MySinglyLinkedList.add("d");
        System.out.println(MySinglyLinkedList.size());

    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/数据结构 3631楼

以下是我自己对UDP 一个发送者与一个接受者,多次咨询,双方互相发送的代码的优化,参考TCP的多线程

首先是Clinet项目

为一个发送者建立两个线程类,一个Send类,一个Receive类。用于发送和接收。

Send类

package com.gz.udp2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Scanner;

public class Send implements Runnable{
    private DatagramSocket ds;
    private Scanner sc;
    private String destIp;//目标ip
    private int destPort;//目标端口号
    private String role;//角色名称
    private boolean flag=true;


    public Send(DatagramSocket ds,String destIp,int destPort,String role) {
        this.ds = ds;
        this.destIp=destIp;
        this.destPort=destPort;
        this.role=role;
        sc=new Scanner(System.in);
    }
    private String getMessage(){
        return sc.next();
    }
    private void send(String str){
        //发送时间
        String date=new Date().toLocaleString();
        str=date+"   "+role+":"+str;
        byte[] buf=str.getBytes();
        try {
            DatagramPacket dp=new DatagramPacket(buf,buf.length, InetAddress.getByName(destIp),destPort);
            ds.send(dp);
        } catch (IOException e) {
            flag=false;
            if(ds!=null) {
                ds.close();
            }
        }
    }

    @Override
    public void run() {
        while(flag){
            this.send(this.getMessage());
        }

    }
}

Receive类

package com.gz.udp2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;

public class Receive implements Runnable{

    private DatagramSocket ds;
    private Scanner sc;
    private boolean flag=true;

    public Receive(DatagramSocket ds) {
        this.ds = ds;
        sc=new Scanner(System.in);
    }
    private String receive(){
        String str="";
        try {
            byte [] buf=new byte[1024];//等待接收数据
            DatagramPacket dp=new DatagramPacket(buf,buf.length);
            ds.receive(dp);
            str=new String(dp.getData(),0,dp.getLength());
        } catch (IOException e) {
            flag=false;
            if(ds!=null){
                ds.close();
            }
        }
        return str;
    }

    @Override
    public void run() {
        while(flag){
            System.out.println(this.receive());
        }
    }
}

Test1类,开启线程的类

package com.gz.udp2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) throws IOException {
        //DS
        DatagramSocket ds=new DatagramSocket(9777);//自己的端口号

        Send s=new Send(ds,"localhost",9888,"咨询者");
        //目标ip,目标端口号,自己角色
        Receive r=new Receive(ds);

        new Thread(s).start();
        new Thread(r).start();


    }
}


对于接收者,也是拥有两个类,Send类和Receive类,及同样的开启线程类,只不过是端口号不同,角色不同。

接收者的Test2类

package com.gz.udp2;

import java.io.IOException;
import java.net.DatagramSocket;

public class Test2 {
    public static void main(String[] args) throws IOException {
        //DS
        DatagramSocket ds=new DatagramSocket(9888);

        Send s=new Send(ds,"localhost",9777,"客服人员");
        //目标ip,目标端口号,自己角色
        Receive r=new Receive(ds);

        new Thread(s).start();
        new Thread(r).start();


    }
}


结果:成功实现了,客服多次回复:又优化加上了发送时间:

咨询者端:

image.png

客服端:

image.png


想让老师看一下我的代码还有哪里值得优化,还有一个问题,就是,单对单的时候,接收者在回复的时候可以获得发送者发送来的ip与端口号,但是我现在写成了多线程,并且在我的发送者与接收者的测试类里,ip跟端口号是单独指定的,也就是说,当线程开启之前,ip与端口号就固定下来了,下面的交互都是这两个ip与端口号之间的交互。我想问的是有办法像单对单那样,获取到上一个接收过来的数据来自的ip和端口号吗,这样的话就要找到上一个接收线程的DatagramPacket数据包dp,从dp能够获取到上一个发送端的ip及端口号,可是由于多线程,我编辑的逻辑是,每次接收和发送的方法都会创建新的DatagramPacket,当上一个线程调用发送方法以后,随着方法结束,dp数据包也会随之在内存中释放消失。所以,我觉得是完不成根据dp获取上一个发送端的ip及端口号的。因此这也是我的发送端和接收端都要重新制定ip及端口号的原因。

思考到这,(小总结******)我在想UDP是不是就是适合于两个人在通信的时候进行的交互,比如qq聊天,客服聊天,并且这两个人的聊天是指定两个人的单次会话的多次聊天。

而TCP适合群聊,中间的服务器可以将信息转发给其他人,也可以满足随时有人加入群聊,为随时加入群聊的客户端开启处理线程。


以上是我的思考,不知道有没有误解,想跟老师求证最后说的总结(带******号的)的正确性。

还有上面多线程的代码是否可以进一步优化,以及我对我的程序中发送端和接收端都要重新制定ip及端口号的理解是否正确。

还有就是UDP的单次会话的多线程如果真的实现是不是像我写的那样的,发送端和接收端都要重新制定ip及端口号。

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 3632楼

一、代码

import numpy as np
from sklearn.datasets import load_sample_images
import tensorflow as tf
import matplotlib.pyplot as plt

# from tensorflow.compat.v1 import ConfigProto
# config = ConfigProto()
# config.gpu_options.allow_growth = True
# config.gpu_options.per_process_gpu_memory_fraction = 1  # 指定显存分配比例


# 加载数据集
# 输入图片通常是3D,[height, width, channels]
# mini-batch通常是4D,[mini-batch size, height, width, channels]
dataset = np.array(load_sample_images().images, dtype=np.float32)
# 数据集里面两张图片,一个中国庙宇,一个花
# m,h,w,c
batch_size, height, width, channels = dataset.shape
print(batch_size, height, width, channels)

# plt.imshow(load_sample_images().images[0])  # 绘制第一个图
# plt.show()

# plt.imshow(load_sample_images().images[1])  # 绘制第二个图
# plt.show()

# 创建两个filters
# 高,宽,通道数,卷积核的个数
# 7, 7, channels, 2
filters_test = np.zeros(shape=(7, 7, channels, 2), dtype=np.float32)
#切片操作
filters_test[:, 3, :, 0] = 1  # 垂直,3代表中间那一列
filters_test[3, :, :, 1] = 1  # 水平

# filter参数是一个filters的集合
X = tf.placeholder(tf.float32, shape=(None, height, width, channels))
# strides=[1, 2, 2, 1] 中第一最后一个为1,中间对应sh和sw
convolution = tf.nn.conv2d(X, filter=filters_test, strides=[1, 1, 1, 1], padding='SAME')

with tf.Session() as sess:
    output = sess.run(convolution, feed_dict={X: dataset})
    print(output.shape)
    # (2,427,640,2)  (多少张照片,高、宽,feature map的数量)


plt.imshow(load_sample_images().images[0])  # 绘制第一个图
plt.show()

plt.imshow(output[0, :, :, 0])  # 绘制第一个图的第一个特征图
plt.show()

plt.imshow(output[0, :, :, 1])  # 绘制第一个图的第二个特征图
plt.show()

plt.imshow(load_sample_images().images[1])  # 绘制第二个图
plt.show()

plt.imshow(output[1, :, :, 0])  # 绘制第二个图的第一个特征图
plt.show()

plt.imshow(output[1, :, :, 1])  # 绘制第二个图的第二个特征图
plt.show()

二、结果

D:\programs\Anaconda3\envs\tf115_py36\python.exe F:/人工智能/11深度学习原理进阶实战代码/04CNN_study/18_convolution.py
2020-08-09 18:07:10.122357: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
WARNING:tensorflow:From F:/人工智能/11深度学习原理进阶实战代码/04CNN_study/18_convolution.py:37: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

2 427 640 3
WARNING:tensorflow:From F:/人工智能/11深度学习原理进阶实战代码/04CNN_study/18_convolution.py:41: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

2020-08-09 18:07:12.672410: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll
2020-08-09 18:07:13.479728: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.442
pciBusID: 0000:01:00.0
2020-08-09 18:07:13.479951: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
2020-08-09 18:07:13.482875: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
2020-08-09 18:07:13.485579: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_100.dll
2020-08-09 18:07:13.487276: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_100.dll
2020-08-09 18:07:13.490839: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_100.dll
2020-08-09 18:07:13.493351: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_100.dll
2020-08-09 18:07:13.500328: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2020-08-09 18:07:13.501102: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2020-08-09 18:07:13.501456: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2020-08-09 18:07:13.503587: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.442
pciBusID: 0000:01:00.0
2020-08-09 18:07:13.503804: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
2020-08-09 18:07:13.503946: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
2020-08-09 18:07:13.504088: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_100.dll
2020-08-09 18:07:13.504231: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_100.dll
2020-08-09 18:07:13.504378: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_100.dll
2020-08-09 18:07:13.504523: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_100.dll
2020-08-09 18:07:13.504667: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2020-08-09 18:07:13.505375: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2020-08-09 18:07:14.039442: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-08-09 18:07:14.039598: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0 
2020-08-09 18:07:14.039691: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N 
2020-08-09 18:07:14.040333: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2127 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)
2020-08-09 18:07:14.163121: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2020-08-09 18:07:14.927996: E tensorflow/stream_executor/cuda/cuda_dnn.cc:319] Loaded runtime CuDNN library: 7.4.1 but source was compiled with: 7.6.0.  CuDNN library major and minor version needs to match or have higher minor version in case of CuDNN 7.0 or later version. If using a binary install, upgrade your CuDNN library.  If building from sources, make sure the library loaded at runtime is compatible with the version specified during compile configuration.
2020-08-09 18:07:14.930492: E tensorflow/stream_executor/cuda/cuda_dnn.cc:319] Loaded runtime CuDNN library: 7.4.1 but source was compiled with: 7.6.0.  CuDNN library major and minor version needs to match or have higher minor version in case of CuDNN 7.0 or later version. If using a binary install, upgrade your CuDNN library.  If building from sources, make sure the library loaded at runtime is compatible with the version specified during compile configuration.
Traceback (most recent call last):
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 1365, in _do_call
    return fn(*args)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 1350, in _run_fn
    target_list, run_metadata)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 1443, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
  (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
	 [[{{node Conv2D}}]]
  (1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
	 [[{{node Conv2D}}]]
	 [[Conv2D/_3]]
0 successful operations.
0 derived errors ignored.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "F:/人工智能/11深度学习原理进阶实战代码/04CNN_study/18_convolution.py", line 42, in <module>
    output = sess.run(convolution, feed_dict={X: dataset})
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 956, in run
    run_metadata_ptr)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 1180, in _run
    feed_dict_tensor, options, run_metadata)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 1359, in _do_run
    run_metadata)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\client\session.py", line 1384, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
  (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
	 [[node Conv2D (defined at D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py:1748) ]]
  (1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
	 [[node Conv2D (defined at D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py:1748) ]]
	 [[Conv2D/_3]]
0 successful operations.
0 derived errors ignored.

Original stack trace for 'Conv2D':
  File "F:/人工智能/11深度学习原理进阶实战代码/04CNN_study/18_convolution.py", line 39, in <module>
    convolution = tf.nn.conv2d(X, filter=filters_test, strides=[1, 1, 1, 1], padding='SAME')
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\ops\nn_ops.py", line 2010, in conv2d
    name=name)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\ops\gen_nn_ops.py", line 1071, in conv2d
    data_format=data_format, dilations=dilations, name=name)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\op_def_library.py", line 794, in _apply_op_helper
    op_def=op_def)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\util\deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py", line 3357, in create_op
    attrs, op_def, compute_device)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py", line 3426, in _create_op_internal
    op_def=op_def)
  File "D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1748, in __init__
    self._traceback = tf_stack.extract_stack()


Process finished with exit code 1

三、问题

tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.

  (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

[[node Conv2D (defined at D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py:1748) ]]

  (1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

[[node Conv2D (defined at D:\programs\Anaconda3\envs\tf115_py36\lib\site-packages\tensorflow_core\python\framework\ops.py:1748) ]]

[[Conv2D/_3]]

0 successful operations.

0 derived errors ignored.


老师,这里的程序是老师的程序,但是运行会出现上述错误,我的cuda和cudann是按照视频里里的教程安装的

image.pngTensorFlow为1.15的版本,也是按照老师教程安装的,为什么会出现“ cuDNN failed to initialize”这个问题。


我上网查了可能是因为显存分配问题,所以加上下述这段代码也不行,麻烦老师帮忙找一下原因?

from tensorflow.compat.v1 import ConfigProto
config = ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.per_process_gpu_memory_fraction = 0.5  # 指定显存分配比例


Python 全系列/第二十四阶段:人工智能基础_深度学习理论和实战(旧)/卷积神经网络CNN 3634楼
Python 全系列/第二十三阶段:人工智能基础_机器学习理论和实战(旧)/代码实战梯度下降法与优化 3635楼

一、代码如下:

"""测试tkinter的label组件的基本用法,使用面向对象的方法"""

from tkinter import *

class Application(Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(self):
        """创建组件"""
        self.btn01 = Button(self,text="登录",width=6,height=3,anchor=E,command=self.login)
        self.btn01.pack()
        self.label01 = Label(self,text="第一个标签",width=10,height=2,bg="black",fg="white")
        self.label01.pack()
        self.label02 = Label(self,text="csh",width=10,height=2,bg="blue",fg="white",font=("黑体",30))
        self.label02.pack()

        # 显示图像
        global photo   #定义全局变量photo,若是局部变量,本方法执行完毕后,图像对象会销毁而不显示
        photo = PhotoImage(file="d:/PythonProject/Examplegif.gif")
        self.label03 = Label(self,image=photo)
        self.label03.pack()

        self.label04 = Label(self,text="河北省\n黄骅港\n崔树辉",justify="left",width=30,height=10,bg="red",fg="yellow",font=("微软雅黑",10))
        self.label04.pack()


if __name__ == "__main__":
    root = Tk()
    root.geometry("600x400+200+300")
    app = Application(master=root)
    app.mainloop()


二、报错信息:

Traceback (most recent call last):

  File "D:/MyPythonProject/venv/a/module_A2.py", line 34, in <module>

    app = Application(master=root)

  File "D:/MyPythonProject/venv/a/module_A2.py", line 10, in __init__

    self.createWidget()

  File "D:/MyPythonProject/venv/a/module_A2.py", line 14, in createWidget

    self.btn01 = Button(self,text="登录",width=6,height=3,anchor=E,command=self.login)

AttributeError: 'Application' object has no attribute 'login'


三、我刚才看了前面有同学提问了这个问题,当时老师解答是缩进原因,我检查了这段代码,没有发现缩进问题,请老师费心解答,谢谢。

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 3636楼

Bluebreey Pie_sever.zip

按照老师的步骤有一个错误导致我这个轮播图不能播放了

WEB前端全系列/第六阶段:音乐社区高级项目模块/音乐社区项目_蓝莓派 3638楼

问题:图片一直加载不出来,是因为JDK版本的原因吗

package com.bjsxt.plane;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * 游戏主窗口
 */
public class MyGameFrame extends Frame {

    Image  plane = GameUtil.getImage("images/plane.png");
    Image  bg = GameUtil.getImage("images/bg.jpg");

    @Override
    public void paint(Graphics g) {     //g当做是一支画笔

        g.drawImage(bg,0,0,500,500,null);
        g.drawImage(plane,100,100,22,33,null);

    }

    //初始化窗口
    public void launchFrame(){
        this.setTitle("飞机大战-尚学堂");
        setVisible(true);   //窗口是否可见

        setSize(500,500);   //窗口大小

        setLocation(400,400);       //窗口打开的位置

        //增加关闭窗口的动作
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);     //正常退出程序
            }
        });

    }

    public static void main(String[] args) {
        MyGameFrame  gameFrame = new MyGameFrame();
        gameFrame.launchFrame();
    }



}
package com.bjsxt.plane;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

/**
 * 游戏的工具类
 */
public class GameUtil {

    //构造器私有。防止别人创建本类的对象.
    private GameUtil(){
    }

    public static Image getImage(String path) {     //images/plane.png
        BufferedImage img = null;
        URL u = GameUtil.class.getClassLoader().getResource(path);
        try {
            img = ImageIO.read(u);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return img;
    }

    public static void main(String[] args) {
        Image img = GameUtil.getImage("images/plane.png");
        System.out.println(img);
    }


}

截图:图片.png

JAVA 全系列/第一阶段:JAVA 快速入门/飞机大战小项目训练 3639楼
JAVA 全系列/第七阶段:生产环境部署与协同开发/Linux 3640楼

一、如下代码

package cn.sxt.pool108;
 
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
public class Test02 {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 如何创建一个线程池
        // 1.创建一个线程池,线程池中只有一个线程对象
         //ExecutorService pool = Executors.newSingleThreadExecutor();
        // 2.创建一个线程池,线程池中有线程的数量固定
         ExecutorService pool = Executors.newFixedThreadPool(10);
        // 3.创建一个线程池,线程池中的线程的数量可以动态的改变
        //ExecutorService pool = Executors.newCachedThreadPool();
         
        //创建一个集合
         List<Future> list = new ArrayList<Future>();
          
        /**使用线程池执行大量的Callable任务*/
        for(int i=0;i<20;i++) {
            //使用匿名内部类
            //创建任务
            Callable<Integer> task = new Callable<Integer>() {
 
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(2000);
                    return (int)(Math.random()*10)+1;
                }              
            };//任务结束
            //将任务交给线程池
            Future f = pool.submit(task);
            //每执行完一个任务就将它添加到集合当中去
            list.add(f);
            //System.out.println(f.get());
        }
        System.out.println("ok?");
        //任务全部执行完毕之后再去遍历集合
        for (Future future : list) {
            System.out.println(future.get());
        }
        System.out.println("OKOK!");
        //关闭线程池
        pool.shutdown();
    }
}

老师,当我将任务交给线程池以后,打印出来f.get();这时候效率没有增加,一个个打印出来。当我放入集合中的时候,也是每次一个个放进来,我并没有觉得效率增加了啊。为什么有System.out.println(f.get());的时候后面的线程要等System.out.println(f.get());完成后再走,而有list.add(f)时,线程可以同步运行。这不应该是同级别的吗?

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 3642楼
Python 全系列/第十五阶段:Python 爬虫开发/爬虫基础(旧) 3643楼
Python 全系列/第十三阶段:高并发性能怪兽-Tornado 框架/Tornado 异步(旧) 3645楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637