170306网络编程线程
一.线程的控制举例 and 简单界面 实现计时功能
1 package runnable; 2 3 import java.awt.GridLayout; 4 import java.awt.event.*; 5 import java.util.Date; 6 7 import javax.swing.*; 8 9 public class ControlThreadDemo extends JFrame{ 10 11 JLabel jlb1; 12 JButton jb1,jb2; 13 JPanel jp1; 14 Thread thread1; 15 boolean isExit=false; 16 17 public ControlThreadDemo(){ 18 this.setLocation(100,100); 19 this.setSize(300,300); 20 this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 21 this.setLayout(new GridLayout(2,1));//两行一列 22 23 jp1=new JPanel(); 24 jb1=new JButton("启动"); 25 jlb1=new JLabel("显示当前时间"); 26 this.add(jlb1); 27 //添加监听器 28 jb1.addActionListener(new ActionListener(){ 29 30 @Override 31 public void actionPerformed(ActionEvent arg0) { 32 // TODO Auto-generated method stub 33 thread1=new Thread(new Runnable(){ 34 35 @Override 36 public void run() { 37 // TODO Auto-generated method stub 38 //获取当前时间 的字符串 date 39 while(!isExit){ 40 jlb1.setText("当前时间为:"+new Date().toString()); 41 try { 42 Thread.sleep(1000);//1秒 43 } catch (InterruptedException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 } 48 49 50 51 } 52 53 }); 54 thread1.start(); 55 } 56 57 }); 58 // 59 60 jb2=new JButton("停止"); 61 //添加监听器 62 jb2.addActionListener(new ActionListener(){ 63 64 @Override 65 public void actionPerformed(ActionEvent arg0) { 66 67 // TODO Auto-generated method stub 68 //获取当前时间 的字符串 date 69 // TODO Auto-generated method stub 70 71 //这个已经out了 72 // if(thread1.isAlive()){ 73 // 74 // thread1.stop(); 75 // } 76 77 isExit=true; 78 79 } 80 81 }); 82 83 jp1.add(jb1); 84 jp1.add(jb2); 85 this.add(jp1); 86 87 this.setVisible(true); 88 89 } 90 91 92 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 93 public static void main(String[]args){ 94 new ControlThreadDemo(); 95 } 96 97 }
二.面向方法的Synthronize
1 package runnable; 2 3 public class SynthronizeDemo { 4 5 static int count=0; 6 7 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 8 public static void main(String[]args){ 9 10 System.out.println("这段代码是被主线程执行的!!!!"); 11 12 //对方法同步 13 new Thread(new Runnable(){ 14 15 @Override 16 public void run() { 17 // TODO Auto-generated method stub 18 for(int i=0;i<10;i++){ 19 add(true); 20 try { 21 Thread.sleep(1000); 22 } catch (InterruptedException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 } 27 28 } 29 30 }).start(); 31 32 33 new Thread(new Runnable(){ 34 35 @Override 36 public void run() { 37 // TODO Auto-generated method stub 38 for(int i=0;i<10;i++){ 39 add(false); 40 try { 41 Thread.sleep(1000); 42 } catch (InterruptedException e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 } 46 } 47 } 48 }).start(); 49 50 } 51 52 //Synthronize相当于给函数加了一把锁,只许一个访问 53 //给方法add加一把同步锁,实现add方法对所有线程的同步 54 public static synchronized void add(boolean flag){ 55 count++; 56 if(flag){ 57 System.out.print("1"); 58 System.out.println("第一个线程进来了,当前count的值 为:"+count); 59 }else{ 60 System.out.print("2"); 61 System.out.println("第二个线程进来了,当前count的值 为:"+count); 62 } 63 } 64 65 }
三.面向对象的Synthronize(这段代码和上一段代码其实效果是一样的)
1 package runnable; 2 3 public class SynthronizeDemo1 { 4 5 static int count=0; 6 //定义一个对象,利用该对象实现线程同步 7 static Object obj=new Object(); 8 9 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 10 public static void main(String[]args){ 11 System.out.println("这段代码是被主线程执行的!!!!"); 12 13 //对方法同步 14 new Thread(new Runnable(){ 15 16 @Override 17 public void run() { 18 // TODO Auto-generated method stub 19 for(int i=0;i<10;i++){ 20 add(true); 21 try { 22 Thread.sleep(1000); 23 } catch (InterruptedException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 } 28 29 } 30 31 }).start(); 32 33 34 new Thread(new Runnable(){ 35 36 @Override 37 public void run() { 38 // TODO Auto-generated method stub 39 for(int i=0;i<10;i++){ 40 add(false); 41 try { 42 Thread.sleep(1000); 43 } catch (InterruptedException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 } 48 49 } 50 51 }).start(); 52 } 53 54 public static void add(boolean flag){ 55 //对obj对象同步,也就是在同一时刻,只有一个线程会执行后面{}里面的代码 56 synchronized(obj){ 57 count++; 58 if(flag){ 59 System.out.print("1"); 60 System.out.println("第一个线程进来了,当前count的值 为:"+count); 61 }else{ 62 System.out.print("2"); 63 System.out.println("第二个线程进来了,当前count的值 为:"+count); 64 } 65 } 66 } 67 68 }
四.窗体+显示坐标 监听器
1 package runnable; 2 3 import java.awt.FlowLayout; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.awt.event.MouseEvent; 7 import java.awt.event.MouseMotionListener; 8 import java.awt.event.WindowAdapter; 9 10 import javax.swing.*; 11 12 public class yy extends JFrame{ 13 JButton jb1; 14 JLabel jlb1; 15 public yy(){ 16 this.setLocation(100,100); 17 this.setSize(500, 500); 18 this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);//啥意思,用户单击窗口的关闭按钮时程序执行的操作 19 20 jb1=new JButton("c s "); 21 jlb1=new JLabel(); 22 23 jb1.addActionListener(new ActionListener(){ 24 25 @Override 26 public void actionPerformed(ActionEvent arg0) { 27 // TODO Auto-generated method stub 28 System.out.println("hello zhbit"); 29 } 30 }); 31 32 this.add(jb1); 33 this.add(jlb1); 34 this.setLayout(new FlowLayout()); 35 36 this.addMouseMotionListener(new MouseMotionListener(){ 37 38 @Override 39 public void mouseDragged(MouseEvent arg0) { 40 // TODO Auto-generated method stub 41 42 } 43 44 @Override 45 public void mouseMoved(MouseEvent arg0) { 46 // TODO Auto-generated method stub 47 int x=arg0.getX(); 48 int y=arg0.getY(); 49 jlb1.setText("x= "+x+" y= "+y); 50 } 51 52 }); 53 this.addWindowListener(new MyWindowsListener()); 54 55 this.setVisible(true); 56 } 57 58 public static void main(String[]args){ 59 new yy(); 60 } 61 class MyWindowsListener extends WindowAdapter{ 62 63 } 64 65 }
五.1使用外部类定义Thread
1 package runnable; 2 3 public class ThreadDemo { 4 5 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 6 public static void main(String[]args){ 7 8 System.out.println("这段代码是被主线程执行的!!!!"); 9 //(3)创建线程类的对象 10 MyThread myThread=new MyThread(); 11 12 //(4)启动该线程,该线程启动后会执行run函数 13 myThread.start(); 14 } 15 } 16 //外部类 17 //利用Thread类来创建线程的步骤:(1)定义一个类继承Thread类 18 class MyThread extends Thread{ 19 20 //(2)重写Thread类中的run方法 21 @Override 22 public void run() { 23 // TODO Auto-generated method stub 24 for(int i=0;i<10;i++){ 25 System.out.println("这段代码被子进程执行!"); 26 try { 27 Thread.sleep(1000);//让当前线程休息一秒 28 } catch (InterruptedException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 } 33 } 34 }
五.2使用匿名类定义Thread
1 package runnable; 2 3 public class ThreadDemo { 4 5 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 6 public static void main(String[]args){ 7 8 System.out.println("这段代码是被主线程执行的!!!!"); 9 /*//(3)创建线程类的对象 10 MyThread myThread=new MyThread(); 11 12 //(4)启动该线程,该线程启动后会执行run函数 13 myThread.start();*/ 14 15 new Thread(){ 16 public void run() { 17 // TODO Auto-generated method stub 18 for(int i=0;i<10;i++){ 19 System.out.println("这段代码被子进程执行!"); 20 try { 21 Thread.sleep(1000);//让当前线程休息一秒 22 } catch (InterruptedException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 } 27 } 28 }.start(); 29 } 30 } 31 //外部类 32 //利用Thread类来创建线程的步骤:(1)定义一个类继承Thread类 33 /*class MyThread extends Thread{ 34 35 //(2)重写Thread类中的run方法 36 @Override 37 public void run() { 38 // TODO Auto-generated method stub 39 for(int i=0;i<10;i++){ 40 System.out.println("这段代码被子进程执行!"); 41 try { 42 Thread.sleep(1000);//让当前线程休息一秒 43 } catch (InterruptedException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 } 48 } 49 }*/
六.1使用外部类使用Runnable接口
//??runnable和thread的区别,在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread///类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
1 package runnable; 2 3 //??runnable和thread的区别 4 5 public class ThreadDemo1 { 6 7 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 8 public static void main(String[]args){ 9 10 System.out.println("这段代码是被主线程执行的!!!!"); 11 12 //(3)创建实现了Runnable接口类的对象 13 MyRunnable myRunnable=new MyRunnable(); 14 15 //(4)创建线程对象,并传入myRunnable对象 16 Thread myThread=new Thread(myRunnable); 17 18 //(5)启动该线程 19 myThread.start(); 20 21 } 22 } 23 24 //外部类 25 //利用Runnable接口来创建线程的步骤:(1)定义一个类实现Runnable接口 26 class MyRunnable implements Runnable{ 27 28 //(2)重写Runnable接口中的run方法 29 @Override 30 public void run() { 31 // TODO Auto-generated method stub 32 for(int i=0;i<10;i++){ 33 System.out.println("这段代码被子进程执行!"); 34 try { 35 Thread.sleep(1000);//让当前线程休息一秒 36 } catch (InterruptedException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 } 41 } 42 }
六.2使用匿名类使用Runnable接口
1 package runnable; 2 3 //??runnable和thread的区别,在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread///类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。 4 5 public class ThreadDemo1 { 6 7 //在java中,一个进程至少有一个线程,该线程会执行main函数的代码,执行main函数代码的线程叫主线程 8 public static void main(String[]args){ 9 10 System.out.println("这段代码是被主线程执行的!!!!"); 11 12 new Thread(new Runnable(){ 13 public void run() { 14 // TODO Auto-generated method stub 15 for(int i=0;i<10;i++){ 16 System.out.println("这段代码被子进程执行!"); 17 try { 18 Thread.sleep(1000);//让当前线程休息一秒 19 } catch (InterruptedException e) { 20 // TODO Auto-generated catch block 21 e.printStackTrace(); 22 } 23 } 24 } 25 }).start();; 26 } 27 }