精华内容
下载资源
问答
  • Java SE学习完成后,自己练手项目十一 这个项目里面出了:任务栏图标功能实现,和浮动图标的实现(SystemTray 、JWindow) 巩固了线程、序列化等概念,再次使用树形、表格 留心主界面的关闭按钮,我改成隐藏...
  • 作为Java的初学者,想通过做一些demo来提升自己的水平,这个项目demo设计多线程,以及javaSwing图形化组件使用: 先展示一下效果图: 点击编译: 点击运行: 只有两个类,比较简单: 代码如下: File...

    作为Java的初学者,想通过做一些demo来提升自己的水平,这个项目demo设计多线程,以及javaSwing图形化组件使用:

    先展示一下效果图:

    点击编译:

    点击运行:

    只有两个类,比较简单:

    代码如下:

    FileWindows.java

    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    import org.junit.Test;
    
    public class FileWindows extends JFrame implements ActionListener, Runnable {
    
    	Thread compiler =  null;
    	Thread run_prom = null;
    	boolean bn = true;
    	CardLayout mycard; //声明布局
    	File file_saved = null;
    	
    	//声明要用到的所有按钮
    	JButton button_input_txt,button_compiler_text,button_compiler,button_run_prom,button_see_doswin;
    	
    	//该画布存放的是卡片布局,只存三块Area,用于切换
    	JPanel p = new JPanel();
    	JTextArea input_text = new JTextArea();
    	JTextArea compiler_text = new JTextArea();
    	JTextArea dos_out_text = new JTextArea();
    	
    	JTextField input_file_name_text = new JTextField();
    	JTextField run_file_name_text = new JTextField();
    	
    	public  FileWindows() {
    		super("java 编译器");
    		
    		//定义卡片布局,用于切换下方区域内容块
    		mycard = new CardLayout();
    		compiler = new Thread(this);
    		run_prom = new Thread(this);
    		button_input_txt = new JButton("程序输入区");
    		//button_input_txt.setName("zq");
    		button_compiler_text = new JButton("编译结果区");
    		button_see_doswin = new JButton("程序运行结果");
    		button_compiler= new JButton("编译程序");
    		button_run_prom= new JButton("运行程序");
    		
    		p.setLayout(mycard);
    		p.add("input",input_text);
    		p.add("compiler",compiler_text);
    		p.add("dos",dos_out_text);
    		add("Center",p);
    		
    		compiler_text.setBackground(Color.pink);
    		dos_out_text.setBackground(Color.cyan);
    		
    		JPanel p1= new JPanel();
    		p1.setLayout(new GridLayout(3,3));
    		
    		p1.add(button_input_txt);
    		p1.add(button_compiler_text);
    		p1.add(button_see_doswin);
    		
    		p1.add(new JLabel("请输入编译文件名(.java)"));
    		p1.add(input_file_name_text);
    		p1.add(button_compiler);
    		p1.add(new JLabel("输入应用程序主类名"));
    		p1.add(run_file_name_text);
    		p1.add(button_run_prom);
    		add(p1,"North");
    		
    		button_input_txt.addActionListener(this);
    		button_compiler.addActionListener(this);
    		button_compiler_text.addActionListener(this);
    		button_run_prom.addActionListener(this);
    		button_see_doswin.addActionListener(this);
    		
    		
    		
    	}
    	
    	
    	
    
    	
    	@Override
    	public void run() {
    		
    		//当前线程为编译时候:
    		if(Thread.currentThread()==compiler) {
    			compiler_text.setText(null);
    			String temp= input_text.getText().trim();
    			byte[] buffer= temp.getBytes();
    			int b=buffer.length;
    			String file_name= null;
    			file_name=input_file_name_text.getText().trim();
    			//创建并保存文件
    			file_saved= new File(file_name);
    			try {
    				OutputStream writefile = new FileOutputStream(file_saved);
    				writefile.write(buffer,0,b);
    				writefile.close();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			
    			
    			//获得该进程的错误流,才可以知道运行结果到底是失败了还是成功。
    			//通过Runtime调用javac命令
    			 try { 
    				 Runtime rt=Runtime.getRuntime();
    				InputStream in=rt.exec("javac "+file_name).getErrorStream();
    				//将字节流包装转换为字符流
    				BufferedInputStream bufIn=new BufferedInputStream(in);
    				byte[] shuzu= new byte[100];
    				//用于记录每次从错误流读取的长度
    				int n =0;
    				boolean flag = true;
    				//将字符流添加到  compiler_text卡片中显示结果
    				while((n=bufIn.read(shuzu,0,shuzu.length))!=-1) {
    					String s = null;
    					s=new String(shuzu,0,n);
    					compiler_text.append(s);
    					//假设有一次读取失败,则s中即为空,正常情况下,下面的一个判断可无
    					if(s!=null)
                        {
                            flag=false;
                        }
    				}
    				//输出完成后判断一次
    				if(flag)
    				{
    					compiler_text.append("Compile Succeed");
    				
    				}
    		
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    		}
    		//当前线程为程序运行结果时候:
    		else if(Thread.currentThread()==run_prom) {
    			
    			 try {
    				 dos_out_text.setText(null);
    				 Runtime rt=Runtime.getRuntime();
    				 String path = run_file_name_text.getText().trim();
    				 Process stream=rt.exec("java "+path);
    				 //记录成功结果
    				 InputStream in = stream.getInputStream();
    				 BufferedInputStream bisIn=new BufferedInputStream(in);
    				 //记录错误结果:
    				 BufferedInputStream bisErr = new BufferedInputStream(stream.getErrorStream());
    				 
    				 byte[] buf=new byte[150];
    				 byte[] err_buf = new byte[150];
    				 int m =0;
    				 int i=0;
    				 String s=null;
    				 String err= null;
    				 while((m=bisIn.read(buf,0,buf.length))!=-1) {
    					 s=new String(buf,0,150);
    					 dos_out_text.append(s);	 
    				 }
    				 while((i=bisErr.read(err_buf))!=-1)
                     {
                     err=new String(err_buf,0,150);
                     dos_out_text.append(err);
                     }
    				 
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			 
    			
    			
    		}
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if(e.getSource()==button_input_txt) {
    			mycard.show(p, "input");
    		}
    		else if(e.getSource()==button_compiler_text) {
    			mycard.show(p,"compiler");
    		}
    		 else if(e.getSource()==button_see_doswin)
             {    //显示程序运行结果区
                 mycard.show(p,"dos");
             }
    		 else if(e.getSource()==button_compiler) {
    			 //如果该线程还存在,则重新开始一个线程
    			 if(!(compiler.isAlive()))
                 {
    				 compiler=new Thread(this);
                 }
    			 compiler.start();
    			 mycard.show(p,"compiler");
    		 }
    		 else if(e.getSource()==button_run_prom) {
    			//如果该线程还存在,则重新开始一个线程
    			 if(!(run_prom.isAlive()))
                 {
                     run_prom=new Thread(this);
                 }
    			 run_prom.start();
    			 mycard.show(p,"dos");
    		 }
    		
    	}
    
    }
    

    运行类Main.java:

    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowStateListener;
    
    public class Main {
    
    	public static void main(String[] args) {
    		FileWindows win= new FileWindows();
    		win.pack();
            //添加正常退出的操作:
    		win.addWindowListener(new WindowAdapter() {
    			@SuppressWarnings("unused")
    			public void windowclosing() {
    				System.out.println(0);
    			}
    			
    		});
    		win.setBounds(200,180,550,360);
    		win.setVisible(true);
    		
    	}
    }
    

    就这么多了,感兴趣的话欢迎提问,半小时内必答

    展开全文
  • 1. 说明 此项目使用到的Java基础知识: Java网络通信 Java多线程 Java输入输出流 Java AWT 图形用户界面绘制 ...Java基础_17 | Java多线程程序设计(Java中两种创建线程的方法、多线程之间的同步和互斥) Ja...

    1. 说明

    此项目使用到的Java基础知识:

    • Java网络通信
    • Java多线程
    • Java输入输出流
    • Java AWT 图形用户界面绘制

    每个知识点参考教程:

    如果有兴趣,还可以添加网络文件传输功能,参考教程:

    2. 服务端源码

    //服务器端
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    
    public class Server {
    
    	public static void main(String[] args) {
    		ServeMainFrame serveMainFrame = new ServeMainFrame("服务器");	//创建主窗体,标题为“服务器”
    		serveMainFrame.setVisible(true);							//设置主窗体可视化
    	}
    }
     /*主窗体类*/
    class ServeMainFrame extends Frame{
    	
    	private final int DEFAULT_WDITH = 500,							//窗体默认宽度
    			DEFAULT_HEIGHT = 400;									//窗体默认高度
    	private Font font = new Font("name",Font.PLAIN,18); 
    	private TextField portInput = new TextField("8000",5),			//端口号输入文本框(默认8000)
    			userInput = new TextField("",46);					    //用户输入文本框
    	private TextArea receieveInput = new TextArea("Welcome to Server!",12,42);	//聊天记录显示文本域
    	private Panel setPanel = new Panel(),							//设置界面(容器)(容器默认FlowLayout)
    			receievePanel = new Panel(),							//接收界面(容器)
    			sendPanel = new Panel();								//发送界面(容器)
    	private StartButton startButton = new StartButton("Start");
    	private ServerSocket ss = null;									//创建服务器套接字(必须要初始化null)	
    	private Socket s = null;										//用于接收处理客户端请求返回的套接字
    	DataInputStream dis = null;
    	private DataOutputStream dos = null;
    	private ServerSendButton serverSendButton = new ServerSendButton("send");
    	private ReceieveClient receieveClient =null;
    	
    	public ServeMainFrame(String title) {	
    		super(title);				//调用父类构造方法,生成带标题的窗体
    		addWindowListener(new WindowsClosed());					//添加窗体监听器,用于关闭窗口
    		setBounds(80, 80, DEFAULT_WDITH, DEFAULT_HEIGHT);			//设置窗体位置和大小
    		setResizable(false);										//设置用户不可调整大小
    		add(setPanel,"North");//添加端口号设置容器到窗体
    			setPanel.add(new Label("Port"));			
    			setPanel.add(portInput);
    			setPanel.add(startButton);
    		add(receievePanel, "Center");  								//添加聊天记录显示容器到窗体
    			receieveInput.setFont(font);
    			receievePanel.add(receieveInput, "Center");
    		add(sendPanel, "South");									//添加用户发送容器到窗体
    			sendPanel.add(new Label("say: "));
    			sendPanel.add(userInput);
    			sendPanel.add(serverSendButton);
    	}
    	/*启动按钮(实现监听器接口)*/
    	class StartButton extends Button implements ActionListener{
    		public StartButton(String name) {
    			super(name);
    			addActionListener(this);  								//自身已经实现监听器接口,很重要的代码!!!	
    		}
    		public void actionPerformed(ActionEvent e) {
    			try {
    				setEnabled(false);
    				ss = new ServerSocket(Integer.valueOf(portInput.getText()));		//利用portInput中的端口号转化为整数,创建一个ServerSocket
    				receieveInput.append("\nserver starting......");					//显示server starting......
    				s = ss.accept();													//等待客户端的连接请求
    				receieveInput.append("\nclient contect successfully");				//连接成功后显示client contect successfully
    					//创建从客户端的输入流
    				dos = new DataOutputStream(s.getOutputStream());
    				dis =new DataInputStream(s.getInputStream());
    				receieveClient = new ReceieveClient();				//创建一个线程,读取客户端输入
    				receieveClient.start();;	//启动该线程
    			}
    			catch(IOException ioe) {
    				receieveInput.append('\n'+ioe.toString());
    			}
    			finally {
    			}
    		}
    	}
    	/*创建一个线程,读取客户端输入*/		//如果实现Runable接口,则会进入死循环
    	class ReceieveClient extends Thread{			
    		public void run() {
    				try {
    					String str = dis.readUTF();
    					while(str != null) {
    							receieveInput.append('\n'+"client say: "+ str);
    							str = dis.readUTF();
    					}
    				}
    				catch(IOException ioe) {
    					receieveInput.append('\n'+ioe.toString());
    				}				
    		}
    	}
    	/*服务器发送按钮*/
    	class ServerSendButton extends Button implements ActionListener{
    		public ServerSendButton(String name) {
    			super(name);
    			addActionListener(this);  										//自身已经实现监听器接口,很重要的代码!!!	
    		}
    		public void actionPerformed(ActionEvent e) {
    			try {
    				dos.writeUTF(userInput.getText());
    				dos.flush();
    				receieveInput.append('\n'+"say to client: "+userInput.getText());
    				userInput.setText("");
    			}
    			catch(IOException ioe) {
    				receieveInput.append('\n'+ioe.toString());
    			}
    		}
    	}
    	/*继承自Windows监听器,重写关闭窗体的方法*/
    	class WindowsClosed extends WindowAdapter{
    		public void windowClosing(WindowEvent e) {
    			System.exit(-1);		//程序终止
    		}
    	}
    }
    

    运行起来效果如下:

    3.客户端源码

    //客户端
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    
    public class Client {
    
    		public static void main(String[] args) {
    			ClientMainFrame clientMainFrame = new ClientMainFrame("客户端");		//创建主窗体,标题为“服务器”
    			clientMainFrame.setVisible(true);									//设置主窗体可视化
    		}
    	}
    	 /*主窗体类*/
    	class ClientMainFrame extends Frame {
    		private final int DEFAULT_WDITH = 500,									//窗体默认宽度
    				DEFAULT_HEIGHT = 400;	//窗体默认高度
    		private Font font = new Font("name",Font.PLAIN,18); 
    		private TextField ipInput = new TextField("127.0.0.1",8),				//ip地址输入文本框(默认127.0.0.1)
    				portInput = new TextField("8000",5),							//端口号输入文本框(默认8000)
    				userInput = new TextField("",46);							//用户输入文本框
    		private TextArea receieveInput = new TextArea("Welcome to Client!",12,42);			//聊天记录显示文本域
    		private Panel setPanel = new Panel(),									//设置界面(容器)(容器默认FlowLayout)
    				receievePanel = new Panel(),									//接收界面(容器)
    				sendPanel = new Panel();										//发送界面(容器)
    		private ConnectButton connectButton = new ConnectButton("Connect");
    		private ClientSendButton clienttSendButton = new ClientSendButton("send");
    		private Socket s = null;					//用于接收处理客户端请求返回的套接字
    		private DataOutputStream dos = null;				//客户端输出流
    		private DataInputStream dis = null;
    		ReceieveServer receieveServer = null;
    		public ClientMainFrame(String title) {	
    			super(title);														//调用父类构造方法,生成带标题的窗体
    			addWindowListener(new WindowsClosed());							//添加窗体监听器,用于关闭窗口
    			setBounds(600, 80, DEFAULT_WDITH, DEFAULT_HEIGHT);					//设置窗体位置和大小
    			setResizable(false);												//设置用户不可调整大小
    			add(setPanel,"North");												//添加设置容器到窗体
    				setPanel.add(new Label("Server IP: "));
    				setPanel.add(ipInput);
    				setPanel.add(new Label("Port: "));			
    				setPanel.add(portInput);
    				setPanel.add(connectButton);
    			add(receievePanel, "Center");  										//添加聊天记录显示容器到窗体
    				receieveInput.setFont(font);
    				receievePanel.add(receieveInput, "Center");
    			add(sendPanel, "South");											//添加用户发送容器到窗体
    				sendPanel.add(new Label("say: "));
    				sendPanel.add(userInput);
    				sendPanel.add(clienttSendButton);
    		}
    		/*连接按钮(实现监听器接口)*/
    		class ConnectButton extends Button implements ActionListener{
    			public ConnectButton(String name) {
    				super(name);
    				addActionListener(this);  										//自身已经实现监听器接口,很重要的代码!!!	
    			}
    			public void actionPerformed(ActionEvent e) {
    				try {
    					setEnabled(false);
    					s = new Socket(ipInput.getText(),Integer.valueOf(portInput.getText()));			//等待客户端的连接请求
    					receieveInput.append("\nserver contect successfully!");		//连接成功后显示client contect successfully
    					dos = new DataOutputStream(s.getOutputStream());
    					dis = new DataInputStream(s.getInputStream());
    					receieveServer = new ReceieveServer();
    					receieveServer.start();
    				}
    				catch(IOException ioe) {
    					receieveInput.append('\n'+ioe.toString());
    				}
    				finally {
    				}
    			}
    		}
    		/*客户端发送按钮*/
    		class ClientSendButton extends Button implements ActionListener{
    			public ClientSendButton(String name) {
    				super(name);
    				addActionListener(this);  										//自身已经实现监听器接口,很重要的代码!!!	
    			}
    			public void actionPerformed(ActionEvent e) {
    				try {
    					dos.writeUTF(userInput.getText());
    					dos.flush();
    					receieveInput.append('\n'+"say to serve: "+userInput.getText());
    					userInput.setText("");
    				}
    				catch(IOException ioe) {
    					receieveInput.append('\n'+ioe.toString());
    				}
    				
    			}
    		}
    		/*创建一个线程,读取服务器输入*/
    		class ReceieveServer extends Thread{
    			public void run() {
    					try {
    							String str = dis.readUTF();
    							while(str != null){
    								receieveInput.append('\n'+"serve say: "+str);	
    								str = dis.readUTF();
    						}
    							
    					}
    					catch(IOException ioe) {
    						receieveInput.append('\n'+ioe.toString());
    					}				
    			}
    		}
    		/*继承自Windows监听器,重写关闭窗体的方法*/
    		 class WindowsClosed extends WindowAdapter{
    			public void windowClosing(WindowEvent e) {
    					System.exit(-1);		//程序终止
    				}
    		}
    		
    		
    	}
    

    运行起来效果如下:

    4. 运行效果

    启动服务器监听

    客户端连接服务器


    客户端连接之后在服务端也可以看到:

    客户端发送消息

    服务端发送消息


    接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

    展开全文
  • 本题由于共享了一个账户,因此会有线程安全问题,我采用了同步方法保证线程安全。 代码包括账户类,顾客类,银行系统类。代码如下: /* 银行账户类型 */ public class Account { private int balance; //余额 ...

    两个人分别往同一个账户打钱,分三次,每次打1000;
    本题由于共享了一个账户,因此会有线程安全问题,我采用了同步方法保证线程安全。
    代码包括账户类,顾客类,银行系统类。代码如下:

    /*
    银行账户类型
    
     */
    
    public class Account {
        private int balance;    //余额
    
        public void setBalance(int money) {
            this.balance = balance+money;
        }
    
        public int getBalance() {
            return balance;
        }
    }
    
    /*
    顾客类型,采用多线程(继承方法),解决了安全问题(同步方法)
    
    
     */
    public class Customer extends Thread {
        private static Account acc;
        private static int money=1000;
        public Customer(Account acc) {
            this.acc = acc;
        }
    
        @Override
        public void run() {
    
            show();
        }
    
        public synchronized static void show(){
            int i=0;
            while (i<3){
                acc.setBalance(money);
                System.out.println(Thread.currentThread().getName()+"存了1000元钱到acc账户中,余额为"+acc.getBalance()+"");
                i++;
            }
        }
    }
    
    
    /*
    银行系统
    
     */
    public class Bank {
        public static void main(String[] args) {
            Account acc = new Account();
            Customer c1 = new Customer(acc);
            Customer c2 = new Customer(acc);
    
            c1.setName("张三");
            c2.setName("李四");
    
            c1.start();
            c2.start();
    
    
        }
    
    }
    

    运行结果如下:
    在这里插入图片描述

    展开全文
  • 51、使用 pop 和 del 删除字典中的"name"字段52、列出常见 MYSQL 数据存储引擎53、计算代码运行结果,zip 函数历史文章...cookie 和 session 的区别56、简述多线程、多进程57、简述 any()和 all()方法58、IOError、A...

    51、使用 pop 和 del 删除字典中的"name"字段

    52、列出常见 MYSQL 数据存储引擎

    53、计算代码运行结果,zip 函数历史文章已经说了,得出 [(“a”,1),(“b”,2),(“c”,3),(“d”,4),(“e”,5)]

    54、简述同源策略

    55、简述 cookie 和 session 的区别

    56、简述多线程、多进程

    57、简述 any()和 all()方法

    58、IOError、AttributeError、ImportError、IndentationError、 IndexError、KeyError、SyntaxError、NameError 分别代表什么 异常

    59、python 中 copy 和 deepcopy 区别

    60、列出几种魔法方法并简要介绍用途

    61、C:\Users\ry-wu.junya\Desktop>python 1.py 22 33 命令行 启动程序并传参,print(sys.argv)会输出什么数据?

    62、请将[i for i in range(3)]改成生成器

    63、a = " hehheh ",去除收尾空格

    64、举例 sort 和 sorted 对列表排序,list=[0,-1,3,-10,5,9]

    65、对 list 排序 foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用 lambda 函数从小到大排序

    66、使用 lambda 函数对 list 排序 foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为 [0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从小到大,负数从大到小 (传两个条件,x

    67、列表嵌套字典的排序,分别根据年龄和姓名排序

    68、列表嵌套元组,分别按字母和数字排序

    69、列表嵌套列表排序,年龄数字相同怎么办?

    70、根据键对字典排序(方法一,zip 函数)

    71、根据键对字典排序(方法二,不用 zip)

    72、列表推导式、字典推导式、生成器

    73、最后出一道检验题目,根据字符串长度排序,看排序是否灵活运用

    74、举例说明 SQL 注入和解决办法

    75、s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出 [‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]

    76、正则匹配以 http://163.com 结尾的邮箱

    77、递归求和

    78、python 字典和 json 字符串相互转化方法

    79、MyISAM 与 InnoDB 区别:

    80、HTTP 请求中 get 和 post 区别

    51、使用 pop 和 del 删除字典中的"name"字段

    52、列出常见 MYSQL 数据存储引擎

    53、计算代码运行结果,zip 函数历史文章已经说了,得出 [(“a”,1),(“b”,2),(“c”,3),(“d”,4),(“e”,5)]

    79fb5106ea21886821d4888d052c85b4.png

    dict()创建字典新方法

    469b3fdcc5b640794238f2277303e905.png

    54、简述同源策略

    同源策略需要同时满足以下三点要求:

    1)协议相同

    2)域名相同

    3)端口相同

    只要不满足其中任意一个要求,就不符合同源策略,就会出现“跨域”

    55、简述 cookie 和 session 的区别

    1,session 在服务器端,cookie 在客户端(浏览器)

    2、session 的运行依赖 session id,而 session id 是存在 cookie 中 的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效, 存储 Session 时,键与 Cookie 中的 sessionid 相同,值是开发人员设 置的键值对信息,进行了 base64 编码,过期时间由开发人员设置

    3、cookie 安全性比 session 差

    56、简述多线程、多进程

    进程:

    1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

    2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资 源大,开启的进程数量有限制

    线程:

    1、CPU 进行资源分配和调度的基本单位,线程是进程的一部分,是比 进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该 进程的所有资源

    2、如果 IO 操作密集,则可以多线程运行效率高,缺点是如果一个线程 崩溃,都会造成进程的崩溃

    应用:

    IO 密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程 执行,减少等待的时间

    CPU 密集的用多进程,因为假如 IO 操作少,用多线程的话,因为线程 共享一个全局解释器锁,当前运行的线程会霸占 GIL,其他线程没有 GIL,就不能充分利用多核 CPU 的优势

    57、简述 any()和 all()方法

    any():只要迭代器中有一个元素为真就为真

    all():迭代器中所有的判断项返回都是真,结果才为真

    python 中什么元素为假?

    答案:(0,空字符串,空列表、空字典、空元组、None, False)

    8e4e442fbd4e1ec312bb3784817b04c5.png

    测试 all()和 any()方法

    fe890cd8460fbcb2f9c240939c78064f.png

    58、IOError、AttributeError、ImportError、IndentationError、 IndexError、KeyError、SyntaxError、NameError 分别代表什么 异常

    IOError:输入输出异常

    AttributeError:试图访问一个对象没有的属性

    ImportError:无法引入模块或包,基本是路径问题

    IndentationError:语法错误,代码没有正确的对齐

    IndexError:下标索引超出序列边界

    KeyError:试图访问你字典里不存在的键

    SyntaxError:Python 代码逻辑语法出错,不能执行

    NameError:使用一个还未赋予对象的变量

    59、python 中 copy 和 deepcopy 区别

    1、复制不可变数据类型,不管 copy 还是 deepcopy,都是同一个地址 当浅复制的值是不可变对象(数值,字符串,元组)时和=“赋值”的 情况一样,对象的 id 值与浅复制原来的值相同。

    fa08240271d6e8fc8dfaffd7f83813bd.png

    2、复制的值是可变对象(列表和字典)

    浅拷贝 copy 有两种情况:

    第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影 响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的 id 值与浅复制原来的值不同。

    第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元 素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复 制的值。深拷贝

    deepcopy:完全复制独立,包括内层列表和字典

    6c371bb2ad5e0b9a07443743b4ca65e8.png

    d77b00fe21fb71a49b796719d9cf99f4.png

    60、列出几种魔法方法并简要介绍用途

    init:对象初始化方法

    new:创建对象时候执行的方法,单列模式会用到

    str:当使用 print 输出对象的时候,只要自己定义了

    str(self)方 法,那么就会打印从在这个方法中 return 的数据

    del:删除对象执行的方法

    61、C:\Users\ry-wu.junya\Desktop>python 1.py 22 33 命令行 启动程序并传参,print(sys.argv)会输出什么数据?

    文件名和参数构成的列表

    62、请将[i for i in range(3)]改成生成器

    生成器是特殊的迭代器,

    1、列表表达式的【】改为()即可变成生成器

    2、函数在返回值得时候出现 yield 就变成生成器,而不是函数了;中括号换成小括号即可,有没有惊呆了

    48d3ef5f072def5242f4031bce2f4840.png

    63、a = " hehheh ",去除收尾空格

    5c12bfcd4c1fff870f4d6a3187db5582.png

    64、举例 sort 和 sorted 对列表排序,list=[0,-1,3,-10,5,9]

    d383bdbd4dda0e96f3dde43c980fcb11.png

    65、对 list 排序 foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用 lambda 函数从小到大排序

    66、使用 lambda 函数对 list 排序 foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为 [0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从小到大,负数从大到小 (传两个条件,x

    67、列表嵌套字典的排序,分别根据年龄和姓名排序

    68、列表嵌套元组,分别按字母和数字排序

    50037bb44166536d2e932498c7a43c93.png

    69、列表嵌套列表排序,年龄数字相同怎么办?

    6bede93988ef27712167633e73414802.png

    70、根据键对字典排序(方法一,zip 函数)

    12cd9a73f27417b36bbb4e4e6e39d3f1.png

    71、根据键对字典排序(方法二,不用 zip)

    有没有发现dic.items和zip(dic.keys(),dic.values())都是为了构造列表 嵌套字典的结构,方便后面用 sorted()构造排序规则

    19786cd4948036bc55212d331122eaa1.png

    72、列表推导式、字典推导式、生成器

    4be2d7d5dd581b0b46d06332d0c30db3.png

    73、最后出一道检验题目,根据字符串长度排序,看排序是否灵活运用

    8a0666be60fcc65a37012d5d75a204fa.png

    74、举例说明 SQL 注入和解决办法

    当以字符串格式化书写方式的时候,如果用户输入的有;+SQL 语句,后 面的 SQL 语句会执行,比如例子中的 SQL 注入会删除数据库 demo

    c4d7b7193594bec97bc81248f044a189.png

    解决方式:通过传参数方式解决 SQL 注入

    75、s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出 [‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]

    |表示或,根据冒号或者空格切分

    76、正则匹配以 http://163.com 结尾的邮箱

    361b6a612db0ee640eb6c2afe27ee1cc.png

    77、递归求和

    7d6eb5a4b1e270519d45f1064608f571.png

    78、python 字典和 json 字符串相互转化方法

    json.dumps()字典转 json 字符串,json.loads()json 转字典

    2296ecc6be4cc6a9a20c58a7e9188cf8.png

    79、MyISAM 与 InnoDB 区别:

    1、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务 是一种高 级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM 就不可以了;

    2、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以 及涉及到 安全性较高的应用;

    3、InnoDB 支持外键,MyISAM 不支持;

    4、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是 在 MyISAM 表中可以和其他字段一起建立联合索引;

    5、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重 建表;

    80、HTTP 请求中 get 和 post 区别

    1、GET 请求是通过 URL 直接请求数据,数据信息可以在 URL 中直接 看到,比如浏览器访问;而 POST 请求是放在请求头中的,我们是无法 直接看到的;

    2、GET 提交有数据大小的限制,一般是不超过 1024 个字节,而这种 说法也不完全准确,HTTP 协议并没有设定 URL 字节长度的上限,而是 浏览器做了些处理,所以长度依据浏览器的不同有所不同;POST 请求 在 HTTP 协议中也没有做说明,一般来说是没有设置限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用 GET,大量的数据使 用 POST。

    3、GET 请求因为数据参数是暴露在 URL 中的,所以安全性比较低,比 如密码是不能暴露的,就不能使用 GET 请求;POST 请求中,请求参数 信息是放在请求头的,所以安全性较高,可以使用。在实际中,涉及到 登录操作的时候,尽量使用 HTTPS 请求,安全性更好。

    展开全文
  • 贪吃蛇---练手项目1

    2015-12-24 18:50:22
    贪吃蛇小游戏运用多线程,双缓冲技术,以及awt,练手项目
  • 其实初学者大多和题主类似...这个阶段最主要的学习方法还是练,可以阅读一些开源项目代码然后找一些合适的项目练手,以下是我收集整理的针对Python初学者的小项目及练习。* 开源项目1.Requestsrequests/re...
  • 程序员练手项目

    千次阅读 2018-03-16 15:04:51
    下面是一些适合练手的小项目,适合新手练手和老手闲暇时回顾一下曾经写过的一些小项目。下面有很多项目,仔细看了一下,动手写过得并没有很。适合收藏起来,闲下来的时候再写一遍。 文本操作 • 逆转字符串——...
  • 程序员练手项目

    2018-09-07 13:58:16
    2016年9月21日,该文章推送到微信公众号 程序员的那些事 (ID: iProgrammer ) 后,@BleethNie 留言建议把这 120+ 练手项目统一放在一个地方,同时其他人可以把自己完成项目提交合并到一起,相互参考学习。...
  • 练手项目

    2016-07-27 19:48:56
    下面你们会看到 120 个个项目构思,都是我通过头脑风暴得来的。我将其根据主题分成了10 个分类,但有些项目其实涵盖了不止一个主题。 更新:如果你喜欢这些构思的话,你也可以读一下我做的电子书(伯乐在线...
  • java 练手项目

    千次阅读 多人点赞 2018-03-29 20:45:28
    学习了javaSE的基础,为了巩固对Java面向对象编程,以及java多线程编程的理解,使用swing 写了一个很简单的小项目,源码github地址: https://github.com/pythondever/swing-demo 喜欢的同学可以学习学习 整体...
  • 3.网上的资源零散,缺少详细又难度适中的项目练手 那么在这个过程中我们的目的便是—— 将知识点整合,对于项目有具体而明晰的思路,这有助于为自己以后的学习增加经验与自信心。 闲言少叙,让我们先来一睹飞机...
  • 本期课程为《Linux系统编程》的练手项目:带领大家从零开始,使用仅仅50余行代码,就可以实现一个简单的协程,实现协程的三个基本API接口函数:create、yield、resume。从最开始的汇编开始,到最上层的API的封装,...
  • C语言是咱们大多数人的编程入门语言,对其也再熟悉不过了,不过不少初学者在学习的过程当中不免会出现迷茫,好比:不知道C语言能够开发哪些项目,能够应用在哪些实际的开发中……,这些迷茫也致使了咱们在学习的过程...
  • java项目源码分享——适合新手练手的java项目

    万次阅读 多人点赞 2018-03-16 10:48:45
    java swing开发网络聊天室群聊系统,基于java多线程socket编程 源码下载(实例二): java swing开发大猫聊天室源码,简单易懂,适合java swing初学者 源码下载(实例三): java websocket开发简单聊天室系统,...
  • 邮件客户端(练手项目十二) 在移动139邮箱测试通过,测试中发现问题,收邮件没有开线程如果邮件特别的情况下会出现卡着按钮(主线程被阻塞)的情况,需要使用代码的时候注意监听开线程. 难度反而较项目11难度略...
  • 1. 概述 ​ 爬取3DM指定网页的游戏壁纸,并且...​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9drAZePc-1590219277095)(练手项目,爬取3DM图片/1.JPG)] #3DM import requests#引..
  • 练手项目列表

    2015-11-11 21:34:20
     文本操作 逆转字符串——输入一个字符串,...可以在维基百科上了解更内容。 统计元音字母——输入一个字符串,统计处其中元音字母的数量。更复杂点的话统计出每个元音字母的数量。 判断是否为回文——判
  • 商城练手项目记录

    2020-05-24 23:34:30
    各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用...
  • 其实初学者大多和题主类似...这个阶段最主要的学习方法还是练,可以阅读一些开源项目代码然后找一些合适的项目练手,以下是我收集整理的针对Python初学者的小项目及练习。* 开源项目1.Requestsrequests/re...
  • 其实初学者大多和题主类似...这个阶段最主要的学习方法还是练,可以阅读一些开源项目代码然后找一些合适的项目练手,以下是我收集整理的针对Python初学者的小项目及练习。* 开源项目1.Requestsrequests/re...
  • 练手题目: 这周抽空做完了老师布置的题目 其中有一道关于线程的题目蛮考验人的 题目是 开启2个线程,一个打印ABCD…XYZ,一个打印12345…26,要求A1B2C3…Z26依次打印 问题描述: 首先 ,这道题考线程机制的 ,...
  • 程序猿练手项目

    2015-11-24 10:35:42
    不过我觉得只列出三两个是远远不够的,因此就收集并这个项目列表,大家要找简单的编程项目学习练手的话,可以收藏并扩散本文。 下面你们会看到 120 个个项目构思,都是我通过头脑风暴得来的。我将其根据主题...
  • Java 初学者练手项目

    2019-03-08 17:02:22
    难度一般,适合具有 Java 基本语法和核心 API 基础的同学学习实践多线程编程 推荐指数:??? 链接:https://www.shiyanlou.com/courses/576   5. Java 基于 SSM 框架实现简历生成 ...
  • 最近把SSM框架的基础知识撸了一遍,跟着github上的这个开源项目 ,实现了一下秒杀系统,并对这个项目中存在的问题进行了 一些小小的改进,记录一下,如果是刚学SSM框架希望找个小项目 练手的,可以跟着这个项目来...
  • 转发自http://blog.jobbole.com/49762/ 每完成一个就会将对应项目变成链接。 文本操作 逆转字符串——输入一个字符串,将其逆转并输出。...可以在维基百科上了解更内容。 统计元音字母——输入一个字符串...
  • C语言练手项目--C 语言编写聊天室

    千次阅读 多人点赞 2018-12-12 21:14:04
    暂且不含线程池、多线程编程、超时重传、确认收包等 后续待加功能 实现简单的文件传输。 用户注册和登陆 二、知识点 1、TCP/IP协议 (1)C/S模型 (2)常规步骤 TCP服务端 1、...
  • 别再说找不到Python练手项目了,这80个拿去过冬 40个大数据学习资源 PHP学习资源整理:入门到进阶全系列 8个程序员专用软件/网站,个个是神器,第一个最惊喜… Java进阶之设计模式 Scala 开发教程 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,560
精华内容 4,224
热门标签
关键字:

多线程练手项目