
多线程相关知识点进程与线程的概念进程进行中的程序任何一个进程至少有一个线程进程是操作系统分配资源的最小单位线程进程中的一个子分支可以独立运行CPU执行的最小单位物理线程CPU的逻辑处理器数CPU在绝对的同时只能执行这个数量的线程线程开关控制开需要有新的线程对象创建并启动关一个线程结束执行的唯一标准是run方法中的代码执行完毕Cam1Show打开摄像头1灰度马赛克滤镜处理绘制到窗口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 imagecam.getImage(); //5.灰度马赛克处理 for (int i 0; i image.getWidth()-10; i10) { for (int j 0; j image.getHeight()-10; j10) { //获取采样点颜色 int rgbimage.getRGB(i,j); Color c1new Color(rgb); int redc1.getRed(); int greenc1.getGreen(); int bluec1.getBlue(); //计算灰度值 int gray(redgreenblue)/3; Color c2new Color(gray,gray,gray); //将10x10区域全部转化为灰色 for(int k0;k10;k){ for (int l 0; l 10; l) { image.setRGB(ik,jl,c2.getRGB()); } } } } //6.将处理后的画面绘制到窗口上 g.drawImage(image,80,100,null); } System.out.println(相机1关闭); System.out.println(this.getState());//打印线程状态 } }Cam2Show打开摄像头2直接显示原始画面绘制到窗口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 imagecam.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 ace.getActionCommand();//获取按钮文字 JButton btn(JButton) e.getSource();//获取被点击的按钮 if(ac.equals(相机1开启)){ btn.setText(相机1关闭); cam1Shownew Cam1Show(); cam1Show.gjf.getGraphics(); cam1Show.camcam1; cam1Show.start();//启动线程 }else if(ac.equals(相机1关闭)){ btn.setText(相机1开启); cam1.close(); cam1Show.interrupt(); } else if (ac.equals(相机2开启)) { btn.setText(相机2关闭); cam2Shownew Cam2Show(); cam2Show.gjf.getGraphics(); cam2Show.camcam2; 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.获取电脑上所有摄像头 ListWebcam webcamListWebcam.getWebcams(); for (int i 0; i webcamList.size(); i) { System.out.println(webcamList.get(i).getName()); } Webcam cam1webcamList.get(0);//第一个摄像头 Webcam cam2webcamList.get(2);//第三个摄像头 //2.创建窗口 JFrame jfnew JFrame(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(1500,900); jf.setLocationRelativeTo(null); jf.setLayout(null); //3.创建两个按钮 JButton btn1new JButton(相机1开启); JButton btn2new 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 cam1Shownew Cam1Show(); Cam2Show cam2Shownew Cam2Show(); //5.获取画笔 Graphics gjf.getGraphics(); cam1Show.gg; cam2Show.gg; cam1Show.camcam1; cam2Show.camcam2; //6.创建监听器并连接按钮 CamListener cam3new CamListener(); cam3.cam1cam1; cam3.cam1Showcam1Show; cam3.jfjf; btn1.addActionListener(cam3); CamListener cam4new CamListener(); cam4.cam2cam2; cam4.cam2Showcam2Show; cam4.jfjf; btn2.addActionListener(cam4); } }