多线程相关知识点
- 进程与线程的概念:
- 进程:进行中的程序,任何一个进程至少有一个线程
- 线程:进程中的一个子分支,可以独立运行
- 物理线程:CPU的逻辑处理器数,CPU在绝对的同时只能执行这个数量的线程
- 线程开关控制:
- 开:需要有新的线程对象创建并启动
- 关:一个线程结束执行的唯一标准是run方法中的代码执行完毕
Cam1Show
import com.github.sarxos.webcam.Webcam; import java.awt.*; import java.awt.image.BufferedImage; public class Cam1Show extends Thread{ Webcam cam;//摄像头对象 Graphics g; public void run(){//线程启动后执行的代码 //1.设置摄像头分辨率 cam.setViewSize(new Dimension(640,480)); //2.打开摄像头 cam.open(); System.out.println("相机1打开"); //3.无限循环,不断读取画面并处理 while (true){ if(!cam.isOpen()){ break; } //4.获取一帧画面 BufferedImage image=cam.getImage(); //5.灰度马赛克处理 for (int i = 0; i < image.getWidth()-10; i+=10) { for (int j = 0; j < image.getHeight()-10; j+=10) { //获取采样点颜色 int rgb=image.getRGB(i,j); Color c1=new Color(rgb); int red=c1.getRed(); int green=c1.getGreen(); int blue=c1.getBlue(); //计算灰度值 int gray=(red+green+blue)/3; Color c2=new Color(gray,gray,gray); //将10x10区域全部转化为灰色 for(int k=0;k<10;k++){ for (int l = 0; l < 10; l++) { image.setRGB(i+k,j+l,c2.getRGB()); } } } } //6.将处理后的画面绘制到窗口上 g.drawImage(image,80,100,null); } System.out.println("相机1关闭"); System.out.println(this.getState());//打印线程状态 } }
Cam2Show
import java.awt.*; import java.awt.image.BufferedImage; public class Cam2Show extends Thread{ Webcam cam; Graphics g; public void run(){ cam.setViewSize(new Dimension(640,480)); cam.open(); System.out.println("相机2打开"); while(true){ if(!cam.isOpen()){ break; } BufferedImage image=cam.getImage(); g.drawImage(image,750,100,null); } System.out.println("相机2关闭"); System.out.println(this.getState()); } }
CamListener
import com.github.sarxos.webcam.Webcam; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class CamListener implements ActionListener{ Webcam cam1; Webcam cam2; Cam1Show cam1Show;//摄像头1的线程对象 Cam2Show cam2Show;//摄像头2的线程对象 JFrame jf; @Override public void actionPerformed(ActionEvent e) { String ac=e.getActionCommand();//获取按钮文字 JButton btn=(JButton) e.getSource();//获取被点击的按钮 if(ac.equals("相机1开启")){ btn.setText("相机1关闭"); cam1Show=new Cam1Show(); cam1Show.g=jf.getGraphics(); cam1Show.cam=cam1; cam1Show.start();//启动线程 }else if(ac.equals("相机1关闭")){ btn.setText("相机1开启"); cam1.close(); cam1Show.interrupt(); } else if (ac.equals("相机2开启")) { btn.setText("相机2关闭"); cam2Show=new Cam2Show(); cam2Show.g=jf.getGraphics(); cam2Show.cam=cam2; cam2Show.start(); } else if (ac.equals("相机2关闭")) { btn.setText("相机2开启"); cam2.close(); cam2Show.interrupt(); } } }
Test1类
- 获取摄像头列表
- 创建窗口
- 创建两个按钮(控制摄像头开启/关闭)
- 创建两个显示线程
- 连接按钮与监听器
import com.github.sarxos.webcam.Webcam; import javax.swing.*; import java.awt.*; import java.util.List; public class Test1 { static void main() { //1.获取电脑上所有摄像头 List<Webcam> webcamList=Webcam.getWebcams(); for (int i = 0; i < webcamList.size(); i++) { System.out.println(webcamList.get(i).getName()); } Webcam cam1=webcamList.get(0);//第一个摄像头 Webcam cam2=webcamList.get(2);//第三个摄像头 //2.创建窗口 JFrame jf=new JFrame(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(1500,900); jf.setLocationRelativeTo(null); jf.setLayout(null); //3.创建两个按钮 JButton btn1=new JButton("相机1开启"); JButton btn2=new JButton("相机2开启"); btn1.setBounds(300,600,100,50); btn2.setBounds(800,800,100,50); jf.add(btn1); jf.add(btn2); jf.setVisible(true); //4.创建两个显示线程对象 Cam1Show cam1Show=new Cam1Show(); Cam2Show cam2Show=new Cam2Show(); //5.获取画笔 Graphics g=jf.getGraphics(); cam1Show.g=g; cam2Show.g=g; cam1Show.cam=cam1; cam2Show.cam=cam2; //6.创建监听器并连接按钮 CamListener cam3=new CamListener(); cam3.cam1=cam1; cam3.cam1Show=cam1Show; cam3.jf=jf; btn1.addActionListener(cam3); CamListener cam4=new CamListener(); cam4.cam2=cam2; cam4.cam2Show=cam2Show; cam4.jf=jf; btn2.addActionListener(cam4); } }