threads לא פותרים בעיות,
רק יוצרים אותן
וביתר רצינות, threads מאפשרים לך לתכנת בצורה יותר טבעית. אם יש לך אפליקציה שצריכה לעשות מספר משימות במקביל, אתה יכול לעשות את זה - לנהל את זה - בעצמך, ואתה יכול לתת למערכת ההפעלה לעשות switch-ים בין מספר תהליכונים שרצים "במקביל" (מובן שלא באמת במקביל, כי יש CPU אחד על המערכת). למשל, נגיד שאתה כותב שרת WEB, שעונה לפניות של HTTP. יש לך כמה משימות בשרת. לדוגמה: 1. להקשיב ל-connections חדשים שנכנסים לשרת 2. לתחזק connections קיימים 3. לבצע קוד server side (כמו דפי PHP/JSP/ASP) וכו'. אתה יכול לעשות לולאה מרכזית בתוכנה שלך, שבכל פעם תבדוק אם יש connections חדשים, מה צריך לעשות עם הישנים, ואיזה קוד server side צריך לבצע כרגע. הבעיה היא שכשתעשה את אחד הדברים הללו, לא תוכל לעשות משהו אחר. למשל, אם ה-server side code שאתה מריץ לוקח 5 שניות, לא תוכל לעשות דברים אחרים בזמן הזה - כמו לקבל פניות חדשות. זו הבעיה בקוד ליניארי. עכשיו, כדי לפתור את הבעיה הזו, עליך לפצל את ביצוע ה-server side code לחלקים בגודל שתקבע בעצמך - למשל, 10ms - ואז להפסיק את העבודה ולנסות לעשות דברים אחרים. זו בעיה ממש לא פשוטה, ומתכון בטוח לצרות. כאן נכנסים thread-ים. אתה מחלק את האפליקציה כך ש-thread אחד מטפל ב-connections נכנסים, thread אחר מטפל בקוד server side, וכו'. זה פוטר אותך מטיפול בעצמך בכל הניהול המסובך של העסק, אבל מציב אתגרים חדשים. למשל, נגיד שיש לך רשימה כלשהי של אובייקטים, ושני thread-ים שונים מנסים לגשת אליה בו זמנית. זה עלול ליצור בלאגן גדול ברשימה, ולכן אתה צריך להכניס סינכרוניזציה בין ה-threads השונים, ולהגן על משאבים משותפים. בקיצור, תכנות multithreaded הוא לא פשוט ויש בו הרבה בעיות פוטנציאליות, אבל הוא מפשט מאוד את מבנה התוכנה ומאפשר להבין אותה טוב יותר.