关于线程

2019-02-28 23:30|来源: 网络

    

                 线程,学了挺久了。我发现我不会写总结这种东西。

 

                 好吧,我又词穷了。不知道该怎么写了。先打开eclipse看看。先说说我对线程的理解把。

 

                我觉得线程就是好几条流水线在一起工作,能提高工作效率和空间利用率。就像一个工厂,如果只用一条流水线,那每天生产的鞋子估计少得可怜,利润应该也不怎么样,这样的工厂应该关门了。但是如果一个工厂有好多条流水线,同时生产好多鞋子,那就可以挣好多钱,可以在这个行业有很强的竞争力。程序也是一样。一个只能单条路走下去的程序只能用来当教材。多条路一起走的程序才是有效率的程序。

 

                放个简单的小球程序把,小球还不是立体的、、

 

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ThreadFrame extends JFrame{

	
	public static void main(String[] args) {
		ThreadFrame tf = new ThreadFrame();
		tf.init();
	}
	public void init(){
		
		//设置属性
		this.setTitle("弹球");
		this.setSize(1000,600);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
	//	this.setLayout(new FlowLayout());
		
		//实例化一个按钮
		JButton jbu1 = new JButton("发射");
		this.add(jbu1,BorderLayout.NORTH);
		JPanel jpa=new JPanel();
		this.add(jpa,BorderLayout.CENTER);
		//BallListener bl = new BallListener(jpa, ball);
		//设置可见
		this.setVisible(true);
		
		Graphics g = this.getGraphics();
		
		BallThread  ball=new BallThread(jpa);
	//	ball.start();
		BallListener tl = new BallListener(jpa,ball);
		jbu1.addActionListener(tl);
		
		
	}

}

 

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.BitSet;

import javax.swing.JPanel;

public class BallListener implements ActionListener{

	private Graphics g;
	private BallThread ball;
	private JPanel jpa;
	//构造方法
	public BallListener(JPanel jpa,BallThread ball){
		this.jpa=jpa;
		this.g=jpa.getGraphics();
		this.ball=ball;
	}
	
	public void actionPerformed(ActionEvent e) {
		
		BallThread bt =new BallThread(jpa);
		bt.start();
	}
	
	
}

 

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JPanel;

public class BallThread extends Thread{
		
	//定义四个方向的常量
	public static final int UP=1;
	public static final int DOWN=2;
	public static final int LEFT=3;
	public static final int RIGHT=4;
	
	//球的半径
	private int r;
	//球的颜色
	private Color color;
	private int c1,c2,c3;
	//x和y方向的速度
	private int xSpeed;
	private int ySpeed;
	
	//运动的方向
	private int xDirection = RIGHT;
	private int yDirection = DOWN;
	//当前球的位置
	private int x,y;
	//最后球的位置
	//private int lastX,lastY;
	
	private Graphics g;
	private JPanel jpa;
	//构造方法
	public BallThread(JPanel jpa) {
		this.jpa=jpa;
		this.g=jpa.getGraphics();
		
	}
	
	public void run(){
		init();
		while(true){
			try
		{
				sleep(50);
		}
		catch(InterruptedException e){
			e.printStackTrace();
		}
			
		clear();
		move();
		draw();
			}
	}
	public void init(){
		
		Random random = new Random();
		xSpeed=2+random.nextInt(5);
		ySpeed=2+random.nextInt(5);
		r=20+random.nextInt(20);
		c1=random.nextInt(256);
		c2=random.nextInt(256);
		c3=random.nextInt(256);
		color=new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
		System.out.print(random.nextInt(256));
	}
	public void move(){
		
		switch(xDirection){
		
		case LEFT:
			x-=xSpeed;
			break;
		case RIGHT:
			x+=xSpeed;
		}
		switch (yDirection) {
		case UP:
			y-=ySpeed;
			break;
		case DOWN:
			y+=ySpeed;
			break;
		}
		
		if(x<=0){ xdirection="RIGHT;">=jpa.getWidth()){xDirection=LEFT;}if(y<=0){ ydirection="DOWN;">=jpa.getHeight()){yDirection=UP;}}private void draw(){g.setColor(color);g.fillOval(x, y, 2*r, 2*r);}private void clear() {g.setColor(jpa.getBackground());g.fillOval(x, y, 2*r, 2*r);}}

 

   
转自:http://www.iteye.com/blog/1911944 

相关问答

更多

我可以在服务器循环中使用阻塞TCP Socket.Send吗?(Can I use blocking TCP Socket.Send in a server loop?)

如果其中一个套接字阻止Send(),它可能会影响其他客户端。 仅当您的服务器是单线程时。 解决方案:多线程。 我担心的是:Send()是否等待“交付”答案? 不,但如果客户端没有读取并且缓冲区填满,它可以阻止。 如果它不是远程客户端可以通过忽略传入的数据包来阻止我的服务器事件处理循环 - 那么我应该使用BeginSend。 但我已经测量过BeginSend吃了更多的CPU。 所以我想知道天气是否可以在服务器事件循环中使用阻塞发送? 不,不是。 如果您能克服厌恶,请使用多线程,非阻塞I / O或异

Python,Tkinter:如何使用线程防止tkinter gui mainloop崩溃(Python, Tkinter: how can I prevent tkinter gui mainloop crash using threading)

这是使用threading的简短示例。 我拿出你的other功能,我不知道为什么你在这里使用itertools 。 我也把它拿出来并简单地使用一个简单的线程示例进行设置。 一些东西: 您使用threading.Thread作为Threader的基类进行设置,但您从未实际初始化基类。 无论何时使用线程,通常都要定义一个run方法,然后使用start()来启动线程。 调用start()将调用run 。 您需要使用线程来阻止GUI阻塞,因为tkinter只是巨型循环中的一个线程。 因此,只要您有一个长

在线程中调用互操作Excel函数时的CastError?(CastError when calling interop Excel functions in a thread?)

在Excel中使用多个线程没有任何意义,因为Excel的COM接口基本上是单线程的(参见本文 )。 加载项中可能存在进一步的限制。 但我不得不说我真的不明白错误信息试图说的是什么。 Using multiple threads in Excel makes no sense because Excel's COM interface is basically single threaded (see this article). There might be further restrictio

tableview静态单元格动态页脚(tableview static cell dynamic footer)

您应该在后台线程中进行计算。 在这里为UILabel分配一个新值,但主线程没有时间刷新视图。 - (void) callDoStuff { [self doStuff]; } - (void)doStuff { dispatch_async(dispatch_queue_create("myqueue", NULL) , ^(void) { // Here you enter in another thread for (int i=0; i<[

CAsyncSocket没有触发事件?(CAsyncSocket not firing events?)

CAsyncSocket类在内部使用Windows消息来触发事件。 您需要在具有消息循环的线程中创建CAsyncSocket派生类。 在这种情况下,将调用事件。 伪代码: // This function runs in the context of worker thread void MyClass::ThreadFunction() { mySocket.Create(...); // creating CAsyncSocket-derived class // R