会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132843个问题

package com.bjsxt;

/**
 * 生产者消费者模式
 */
public class ProduceThread {
    public static void main(String[] args) {
        SyncStack ss = new SyncStack();
        new Producer(ss).start();
        new Consumer(ss).start();
    }
}

/**
 * 创建缓冲区
 */
class ManTou{   /**定义馒头类*/
    private int id;

    public ManTou(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}
class SyncStack{    /**定义缓冲区类*/
    private ManTou[] mt = new ManTou[10];   // 定义存放馒头的盒子
    private int index;  // 定义操作盒子的索引
    /**放馒头*/
    public synchronized void push(ManTou manTou){
        // 判断盒子满否
        while (this.index == this.mt.length){
            /**
             * 语法:wait(),该方法必须要在synchronized块中调用。
             * wait执行后,线程会将持有的对象锁释放,并进入阻塞状态,
             * 其他需要该对象锁的线程就可以继续运行了。
             */
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 唤醒取馒头的线程
        /**
         * 语法:该方法必须要在synchronized块中调用。
         * 该方法会唤醒处于等待状态队列中的一个线程。
         */
        this.notify();
        this.mt[index] = manTou;
        index++;
    }
    /**取馒头*/
    public synchronized ManTou pop(){
        while (index == 0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify();
        index--;
        return this.mt[index];
    }
}

/**
 * 创建生产者消费者线程
 */
class Producer extends Thread{  /**定义生产者线程类*/
    private SyncStack ss;
    public Producer(SyncStack ss){
        this.ss = ss;
    }

    @Override
    public void run() {
        for (int i=1; i<11; i++){
            System.out.println("生产馒头:"+i);
            this.ss.push(new ManTou(i));
        }
    }
}

class Consumer extends Thread{  /**定义消费者线程类*/
    private SyncStack ss;
    public Consumer(SyncStack ss){
        this.ss = ss;
    }

    @Override
    public void run() {
        for (int i=1; i<11; i++){
            ManTou manTou = this.ss.pop();
            System.out.println("消费馒头:"+i);
        }
    }
}

附上代码,照着讲义敲的(只改了几个名字)

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 16726楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 16727楼
JAVA 全系列/第五阶段:JavaWeb开发/XML技术(旧) 16728楼
JAVA 全系列/(旧的隐藏)第七阶段:JAVA 高级技术/Dubbo 16730楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 16732楼

K{5IBQGAMRQA7ECI`)K7FG0.png

IMG_20200310_213556(1).jpg

老师,您看一下是啥原因,重安装好多次都是这

JAVA 全系列/第三阶段:数据库编程/Oracle 数据库的使用 16734楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 16736楼
Python 全系列/第二阶段:Python 深入与提高/模块 16737楼

老师,你看这个是按照上面敲得,有按钮,但是按钮没反应,也不报错,这是怎么回事?

# 开发画笔软件
from tkinter.filedialog import *
from tkinter.colorchooser import *

win_width=900;win_height=450

class Application(Frame):
    def __init__(self,master=None,bg='#000000'):
        super().__init__(master)
        self.x = 0
        self.y = 0
        self.bg=bg
        self.fg='#ff0000'
        self.lastDraw=0
        self.starDrawFlag=False
        self.pack()
        self.createWidget()

    def createWidget(self):
        # 绘图区
        self.drawpad = Canvas(self,width=win_width,
                height=win_height*0.9,bg=self.bg)
        self.drawpad.pack()

        # 设定按钮
        btn_start=Button(self,text='开始',name='start')
        btn_start.pack(side='left',padx='10')
        btn_pen = Button(self, text='画笔', name='pen')
        btn_pen.pack(side='left', padx='10')
        btn_rect = Button(self, text='矩形', name='rect')
        btn_rect.pack(side='left', padx='10')
        btn_clear = Button(self, text='清屏', name='clear')
        btn_clear.pack(side='left', padx='10')
        btn_eraser = Button(self, text='橡皮擦', name='eraser')
        btn_eraser.pack(side='left', padx='10')
        btn_line = Button(self, text='直线', name='line')
        btn_line.pack(side='left', padx='10')
        btn_lineArrow = Button(self, text='箭头直线', name='lineArrow')
        btn_lineArrow.pack(side='left', padx='10')
        btn_color = Button(self, text='颜色', name='color')
        btn_color.pack(side='left', padx='10')

        # 事件处理
        btn_pen.bind_class('Button','<1>',self.eventManager)
        self.drawpad.bind('<ButtonRelease-1>',self.stopDraw)

        # 增加颜色切换的快捷键
        root.bind('<KeyPress-r>',self.kuaijiejian)
        root.bind('<KeyPress-g>', self.kuaijiejian)
        root.bind('<KeyPress-y>', self.kuaijiejian)

    def eventManager(self,event):
        name=event.widget.winfo_name()
        if name == 'line':
            self.drawpad.bind('<B1-Motion>',self.myline)
        elif name == 'lineArrow':
            self.drawpad.bind('<B1-Motion>',self.mylineArrow)
        elif name == 'rect':
            self.drawpad.bind('<B1-Motion>',self.myrect)
        elif name == 'pen':
            self.drawpad.bind('<B1-Motion>',self.mypen)
        elif name == 'eraser':
            self.drawpad.bind('<B1-Motion>',self.myeraser)
        elif name == 'clear':
            self.drawpad.delete('all')
        elif name == 'color':
            c = askcolor(color=self.fg,title='选择画笔颜色')
            self.fg=c[1]

    def stopDraw(self,event):
        self.startDrawFlag=False
        self.lastDraw=0

    def startDraw(self,event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.starDrawFlag=True
            self.x=event.x
            self.y=event.y

    def myline(self,event):
        self.startDraw(event)
        self.lastDraw=self.drawpad.\
            create_line(self.x,self.y,event.x,event.y,fill=self.fg)

    def mylineArrow(self,event):
        self.startDraw(event)
        self.lastDraw=self.drawpad.create_line(self.x,self.y,
                    event.x,event.y,arrow=LAST,fill=self.fg)

    def myrect(self,event):
        self.startDraw(event)
        self.lastDraw=self.drawpad.create_rectangle(self.x,self.y,
                    event.x,event.y,outline=self.fg)

    def mypen(self,event):
        self.startDraw(event)
        self.drawpad.create_line(self.x,self.y,event.x,event.y,
                    fill=self.fg)
        self.x=event.x
        self.y=event.y

    def myeraser(self,event):
        self.startDraw(event)
        self.drawpad.create_rectangle(event.x-4,event.y-4,
                    event.x+4,event.y+4,fill=self.bg)
        self.x=event.x
        self.y=event.y

    def kuaijiejian(self,event):
        if event.char=='r':
            self.fg='#ff0000'
        elif event.char=='g':
            self.fg='#00ff00'
        elif event.char=='y':
            self.fg='#ffff00'

if __name__ == '__main__':
    root=Tk();root.geometry(str(win_width)+'x'+str(win_height)+'+200+300')
    root.title('百战程序员的画图软件')
    app=Application(master=root)
    root.mainloop()


Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 16740楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637