/// <summary>
        /// Stops all the running channels for this kernel.
        /// This stops their event loops and joins their threads.
        /// </summary>
        public void StopChannels()
        {
            // Close down the threads polling for results
            if (StdInThread != null && StdInThread.IsAlive)
            {
                StdInThread.Interrupt();
            }
            if (ShellThread != null && ShellThread.IsAlive)
            {
                ShellThread.Interrupt();
            }
            if (IoPubThread != null && IoPubThread.IsAlive)
            {
                IoPubThread.Interrupt();
            }

            // Stop all the channel sockets
            if (ShellChannel.IsAlive)
            {
                ShellChannel.Stop();
            }
            if (IoPubChannel.IsAlive)
            {
                IoPubChannel.Stop();
            }
            if (StdInChannel.IsAlive)
            {
                StdInChannel.Stop();
            }
            if (HbChannel.IsAlive)
            {
                HbChannel.Stop();
            }

            // Join any threads that existed
            if (StdInThread != null)
            {
                StdInThread.Join();
            }
            if (ShellThread != null)
            {
                ShellThread.Join();
            }
            if (IoPubThread != null)
            {
                IoPubThread.Join();
            }

            // Clean up any threads
            StdInThread = null;
            ShellThread = null;
            IoPubThread = null;
        }