Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@kitak
Last active December 26, 2015 14:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kitak/7168617 to your computer and use it in GitHub Desktop.
Save kitak/7168617 to your computer and use it in GitHub Desktop.
Javaデザパタ本 マルチスレッド編のsection5。 ProducerConsumerパターン
package main
import "math/rand"
import "time"
import "fmt"
import "strconv"
// Data役
type Cake struct {
Id string
}
// Channel役 goだとそのまんまですね...
type Table chan *Cake
func (self *Table) Put(cake *Cake) {
fmt.Println("put "+cake.Id)
(*self) <- cake
}
func (self *Table) Take() *Cake{
cake := <-(*self)
fmt.Println("take "+cake.Id)
return cake
}
// Producer役
type CakeMaker struct {
Name string
Count int
Table Table
RandSeed int64
}
func (self *CakeMaker) Start() {
source := rand.NewSource(self.RandSeed)
random := rand.New(source)
for {
time.Sleep(time.Millisecond*time.Duration(random.Intn(1000)))
id := "[ Cake No."+strconv.Itoa(self.NextId())+" by "+self.Name+"]"
self.Table.Put(&Cake{id})
}
}
func (self *CakeMaker) NextId() int {
count := self.Count
self.Count += 1
return count
}
// Consumer役
type Eater struct {
Name string
Table Table
RandSeed int64
}
func (self *Eater) Start() {
source := rand.NewSource(self.RandSeed)
random := rand.New(source)
for {
var _ = self.Table.Take()
time.Sleep(time.Millisecond*time.Duration(random.Intn(1000)))
}
}
func main() {
table := make(Table, 3)
maker1 := &CakeMaker{"CakeMaker-1", 0, table, 31415}
maker2 := &CakeMaker{"CakeMaker-2", 0, table, 92653}
maker3 := &CakeMaker{"CakeMaker-3", 0, table, 32384}
eater1 := &Eater{"Eater-1", table, 58979}
eater2 := &Eater{"Eater-2", table, 62643}
eater3 := &Eater{"Eater-3", table, 38327}
go maker1.Start()
go maker2.Start()
go maker3.Start()
go eater1.Start()
go eater2.Start()
go eater3.Start()
for {
time.Sleep(100)
}
}
@udzura
Copy link

udzura commented Oct 28, 2013

Channel役 goだとそのまんまですね...

ええなあ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment